2017-07-08 5 views
0

整数テンプレートパラメータの値に基づいてメンバ変数のタイプを設定するためにstd :: conditionalを使用しようとするプログラムです。std :: conditionalを使用してテンプレートパラメータに基づいてメンバタイプを選択する

私は私のプログラムは、次の出力を与えることを期待
#include <stdio.h> 
#include <type_traits> 
using namespace std; 

class cool{ 
public: 
    cool(){ printf("Cool!\n"); } 
}; 

class notcool{ 
public: 
    notcool(){ printf("Not cool!\n"); } 
}; 

template<int N> 
class myclass{ 
public: 
    typedef std::conditional<N==5,cool,notcool> thetype; 
    thetype theinst; 
}; 

int main(){ 
    printf("Testing\n"); 
    myclass<5> myc5; 
    myclass<6> myc6; 
    printf("Done testing\n"); 
    return 0; 
} 

テスト

クール!

クールでない!

をテストする代わりに、出力が

でテスト

私のコンパイラはGCC 4.9である、と私はこのプログラムをコンパイルした方法だった

をテスト完了完了

コマンドg ++ test -std = C++ 11 -o test

を使用します。

誰も私の期待する出力がプログラムに与えられない理由を教えてもらえますか?

+2

これらはコンストラクターです。オブジェクトmyclassがインスタンス化されると自動的に呼び出されます。 – ttb

答えて

3
typedef typename std::conditional<N==5,cool,notcool>::type thetype; 
//  ^^^^^^^^         ^^^^^^ 
+0

ありがとう、これは動作します。これとコードの違いは何ですか? – ttb

+0

短いC++ 14ウェイ: 'typedef std :: conditional_t <...>型;'。 – HolyBlackCat

+2

@HolyBlackCat 'thetype = std :: conditional_tを使用しています<...>;' – Curious

3

thetypenotcoolない実際coolではない、と。しかし、std::conditional

はい。 std::conditionalはタイプであり、ほとんどのタイプ特性がどのように実装されているかです。基本タイプを条件付きで取得する場合は、基礎となるtypeメンバーにstd::conditionalからアクセスする必要があります。これは、ほとんどの型特性がどのように実装されるかです:それらはすべてtypeメンバを持っています。これは、型特性型ではなく、実際の型にアクセスするために使用できます。 C++ 14では

、あなたがstd::conditionaltypeメンバーのためだけの別名である、std::conditional_tを使用していますが、C++ 11を使用しているため、明示的にアクセスする必要があります。

typedef typename std::conditional<N == 5, cool, notcool>::type thetype; 
関連する問題