我正在学习c ++模板,并希望应用所谓的模板特征来选择数据类型。我在网上找到了一些代码并使其适用于我的案例
#include <iostream>
using namespace std;
template <bool T> struct TM;
template <> struct TM<true> {typedef double MType;};
template <> struct TM<false> {typedef int MType;};
int main(int argc, char *argv[])
{
TM<true>::MType x;
TM<false>::MType y;
cout << sizeof(x) << endl;
cout << sizeof(y) << endl;
return 0;
}
效果很好。但是,似乎这只适用于常量布尔而不是变量,因此以下代码不起作用
#include <iostream>
using namespace std;
template <bool T> struct TM;
template <> struct TM<true> {typedef double MType;};
template <> struct TM<false> {typedef int MType;};
int main(int argc, char *argv[])
{
bool var=true;
TM<var>::MType w;
if (var) TM<true>::MType z;
else TM<false>::MType z;
cout << sizeof(w) << endl;
cout << sizeof(z) << endl;
return 0;
}
那么模板特征是否适用于运行时定义的变量?感谢
答案 0 :(得分:4)
在C ++中,编译器为模板中所有使用过的模板参数创建源代码。这是在编译期间完成的。然后编译创建的源代码,就好像它是常规源代码一样。
因此,在您的情况下,TM<true>
和TM<false>
被视为完全不同的类型。如果您编写类似TM<var>::MType
的内容,编译器无法找到它是哪两种类型,因为在运行时之前信息将不可用。
答案 1 :(得分:2)
来自cppreference:
类型特征定义了一个编译时基于模板的接口,用于查询或修改类型的属性。
在您的情况下,TM<true>
和TM<false
被视为两种不同的类型。 TM<var>::MType
不会让编译器推断出类型。它只能在运行时使用,这是不正确的。编译器如何推导出两种类型中的哪一种呢?
来自标准:
20.9元编程和类型特征[meta]
本小节描述了C ++程序使用的组件,特别是在模板中,用于支持最广泛的类型,优化模板代码使用,检测类型相关的用户错误,以及在编译时执行类型推断和转换。 [...]