1

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

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;

这在我看来不是线程安全的,因为它使用静态成员变量。它真的不是线程安全的吗?该代码以某种方式使我感到困惑。具有相同功能的线程安全的替代品是什么?

为什么我需要这个?

我有一个用于处理矩阵的模板化类,我想使用 Intel Compiler Math Kernel Library 进行矩阵乘法和求逆,其中每种类型的函数都不同,所以在执行矩阵运算之前我必须知道类型。

谢谢你。

4

2 回答 2

3

这在我看来不是线程安全的,因为它使用静态成员变量。

它使用静态常量成员变量(“常量变量”...... ^^ 让我们说“静态成员常量”)。常说的“非线程安全”是静态可变变量(“mutable”的意思是“non-const”,不一定用关键字定义mutable)。

您有时可以看到带有enum { value = 0 };(or 1) 而不是static const bool value = false;(or true) 的代码,但它通常被认为是“hack”并且您会丢失bool类型。

此外,在 C++11 中,直接std::is_same从头文件中使用<type_traits>

于 2013-08-31T14:52:37.910 回答
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 “值”

于 2013-08-31T16:30:15.770 回答