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;

静的メンバー変数を使用しているため、これはスレッドセーフではないように見えます。それは本当にスレッドセーフではありませんか?コードはどういうわけか私を混乱させました。同じ機能を備えたスレッドセーフなものを使用する代わりに何を使用しますか?

なぜこれが必要なのですか?

行列を処理するためのテンプレート化されたクラスがあり、関数が型ごとに異なる行列の乗算と反転にインテル® コンパイラーのマス・カーネル・ライブラリーを使用したいので、行列演算を実行する前に型を知る必要があります。

ありがとうございました。

4

2 に答える 2

3

静的メンバー変数を使用しているため、これはスレッドセーフではないように見えます。

静的定数メンバー変数を使用します(「定数変数」...^^「静的メンバー定数」としましょう)。「スレッドセーフではない」とよく言われるのは、静的可変変数です (「可変」とは「非定数」を意味し、必ずしもキーワードで定義されているとは限りませんmutable)。

enum { value = 0 };(または1) の代わりにstatic const bool value = false;(または) を使用したコードが表示されることがありますtrueが、これは多くの場合「ハック」と見なされ、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 "value" が含まれます

于 2013-08-31T16:30:15.770 に答える