C ++模板类型检查编译时线程安全吗?

时间:2013-08-31 14:47:46

标签: c++ multithreading templates static typechecking

有一种检查类型是否匹配的标准方法:

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;

这看起来不是线程安全的,因为它使用静态成员变量。它真的不是线程安全的吗?代码让我感到困惑。使用相同的功能来保证线程安全的替代方法是什么?

为什么我需要这个?

我有一个用于处理矩阵的模板化类,我想使用英特尔编译器数学核心库进行矩阵乘法和反演,其中函数对于每种类型都不同,所以我必须在执行之前知道类型矩阵运算。

谢谢。

2 个答案:

答案 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”