假设我有以下内容:
在现代(ish)的C++中,我可以使用:
class Foo { };
template <typename T> class Bar { };
template <typename NiftyType> class Baz { };
在现代(ish)的C++中,我可以使用:
typeid(Foo).name() // to will produce "Foo", or
typeid(Bar<int>).name() // to produce "Bar<int>"
但是最后一行给了我实际的模板参数;我需要形式上的。也就是说,我希望能够这样说:
magic<Bar<int>>(); // to produce "Bar<typename T>" or just "T", and
magic<Baz<int>>(); // to produce "Bar<typename Nifty>" or just "Nifty"
我能以某种方式做到这一点吗?
(显而易见的)注释:
- 不仅限于类。
- 我无法检测类型(如果您对此要求感到不满意,请假设这不是我的代码)。但是,可以使用某种混入类的部分解决方案。
- 我不想手动将适当的字符串编写到某个映射中。
typename
参数的名称在每个翻译单元的每个声明中是否需要相同?我不认为这些信息中的任何一个在运行时被保留。为什么要保留?也许作为编译器特定的扩展,但几乎肯定不是标准所必需的。 - 5gon12eder__PRETTY_FUNCTION__
会扩展成像void Baz<Nifty>::foo() [with Nifty = float]
这样的东西,但我不认为那会对你有所帮助。你必须在类体中扩展该宏,而你又说你不想这样做。 - 5gon12eder