【问题标题】:C++ Templatized type check compile time thread safe?C ++模板类型检查编译时线程安全吗?
【发布时间】:2013-08-31 14:47:46
【问题描述】:

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

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 进行矩阵乘法和求逆,其中每种类型的函数都不同,所以在执行之前我必须知道类型矩阵运算。

谢谢。

【问题讨论】:

  • 静态成员不是一个好的设计。使用继承(尽管正如评论中所说,这些都是编译时检查 - 不是线程安全的问题)

标签: c++ multithreading templates static typechecking


【解决方案1】:

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

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

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

另外,在 C++11 中,直接使用标头 &lt;type_traits&gt; 中的 std::is_same

【讨论】:

  • 由于答案可能并不明显,请注意对 is_same 结构成员的每次访问都是在编译时评估的,因此没有任何线程不安全行为的空间。
【解决方案2】:

正如之前在评论中所说,这些都是编译时检查,因此线程安全不是问题。话虽如此,您应该始终在类型检查中使用继承,因为它是更好/更优雅的设计(其次是标准库实现)

类似

 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 "值"

【讨论】:

    猜你喜欢
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 2015-09-28
    相关资源
    最近更新 更多