有一种检查类型是否匹配的标准方法:
template<class T, class U>
struct is_same { static const bool value = false; };
template<class T>
struct is_same<T, T> { static const bool value = true; };
我这样使用它:
if (SamTypeCheck<double,double>::value)
cout<<"same"<<endl;
else
cout<<"different"<<endl;
if (SamTypeCheck<int,double>::value)
cout<<"same"<<endl;
else
cout<<"different"<<endl;
这看起来不是线程安全的,因为它使用静态成员变量。它真的不是线程安全的吗?代码让我感到困惑。使用相同的功能来保证线程安全的替代方法是什么?
为什么我需要这个?
我有一个用于处理矩阵的模板化类,我想使用英特尔编译器数学核心库进行矩阵乘法和反演,其中函数对于每种类型都不同,所以我必须在执行之前知道类型矩阵运算。
谢谢。
答案 0 :(得分:3)
这看起来不是线程安全的,因为它使用静态成员变量。
它使用静态常量成员变量(“常量变量”...... ^^让我们说“静态成员常量”)。通常所说的“非线程安全”是静态可变变量(“可变”意味着“非常量”,不一定用关键字mutable
定义)。
您有时可以使用enum { value = 0 };
(或1
)而不是static const bool value = false;
(或true
)查看代码,但它通常被视为“黑客”而您会丢失bool
类型。
此外,在C ++ 11中,直接使用标题<type_traits>
中的std::is_same
。
答案 1 :(得分:1)
正如之前在评论中所述,这些都是编译时间检查,因此线程安全不是问题。说,你应该总是在类型检查中使用继承,因为它是一个更好/更优雅的设计(后面是标准的库实现)
像
这样的东西 template<typename U, typename T> struct is_same : public std::false_type {};
template<typename T> struct is_same<T, T> : public std::true_type {};
std :: true / false类型包含std :: integral_constant“value”