作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设我有以下内容:
class Foo { };
template <typename T> class Bar { };
template <typename NiftyType> class Baz { };
在现代(大概)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"
我能以某种方式做到这一点吗?
(明显)注释:
最佳答案
怎么样
class Foo { };
template <typename T> class Bar {
static const char * debug_name() { return "Bar<typename T>"; }
};
template <typename NiftyType> class Baz {
static const char * debug_name() { return "Baz<typename NiftyType>"; }
};
然后你可以像这样定义magic
:
template <typename T>
struct magic {
operator const char * () { return T::debug_name(); }
};
随心所欲地使用它
int main() {
magic<Bar<int>>();
magic<Baz<int>>();
}
我认为,根据我的 C++ 经验,要求编译器为您生成 debug_name
是很有希望的。 C++ 是一种很好用的语言,但是内省(introspection)绝对不是它的强项,你要求内省(introspection)到一个模板,而不仅仅是一个类型。
请注意,如果编译器被迫支持你所要求的作为内置的东西,它有效地禁止编译器解析模板定义并丢弃模板参数的(不相关的)标识符名称,并且仅存储已解析的模板定义的 AST 形式,它可能希望这样做以减少内存使用。或者它可能必须对源进行第二次传递以再次获取名称或其他可怕的事情。
我觉得有一些远没有你所要求的那么雄心勃勃的事情是不可能的,或者只有一种可能使用各种编译器特定的扩展。
关于c++ - 我可以获得正式而非实际模板参数的字符串表示形式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35385576/
我正在使用bootstrap templates与 angular-formly我想将 addonsLeft.text 绑定(bind)到模型,以便一旦选择选项发生更改,它就会动态更改。 这是输入的样
我正在尝试以 mm/dd/yyyy 格式向我的列添加一天,但它为我提供了 newdate 的空输出 日期1 = 27/03/2019 SELECT date1,DATE_ADD(CONCAT(date
我是一名优秀的程序员,十分优秀!