2012-05-12 11 views
1

テンプレートクラスを使用した一般的なパターンは、テンプレート引数が簡単にアクセスできるようにクラス内でtypedefされていることである。整数テンプレート引数をテンプレートクラスメンバとしてアクセス可能にする方法はありますか?

#include <type_traits> 
template<class T> struct Foo{ 
    typedef T type; 
}; 
static_assert(std::is_same<Foo<int>::type,int>::value,""); 

私は非型テンプレート引数と同じことを行うことができますどのように?私は次のアイデアしか持っていませんでしたが、もっとエレガントなものが必要ですか?

template<int I> struct Bar{ 
    constexpr static int getI(){ return I; } 
}; 
static_assert(Bar<5>::getI()==5,"error"); 
+0

をなぜエレガントではないということですか? –

+1

これはメソッド呼び出しのようです。 – eudoxos

+1

これはメソッド呼び出しです。それはなぜ問題なのですか? – stijn

答えて

3

この種のものが頻繁にテンプレートメタプログラミングで行われていることを含めて、私はenumを使用する場合がありますが、これの有用性は、私にはやや限られたようだ...

#include <iostream> 
using namespace std; 

template<int N> struct Foo 
{ 
    enum {value_ = N}; 
}; 

int main(int argc, char* argv[]) 
{    
    Foo<42> foo; 

    cout << foo.value_; 

    return 0; 
} 

編集。

+0

クール!正確に私が必要としたもの。テンプレートが別の関数に引数として渡され、そのパラメータを問い合わせたい場合には非常に便利です。このようにどこかに "保存"されない限り、アクセスできません。 – eudoxos

+0

[std :: tuple_size](http://en.cppreference.com/w/cpp/utility/tuple/tuple_size)。私はそれが非常に控えめであると思う。 'std :: tuple <...> :: size'ははるかに読みやすくなります。 – eudoxos

3

あなただけの静的定数変数を使用することができます

template<int I> struct Bar{ 
    static const int i = I; 
}; 

static_assert(Bar<5>::i==5,"error"); 
+0

あなたはどこかでそれを定義することを覚えておく必要がありますが、それは迷惑です。 –

+0

そういうわけで、私はそれを提案しなかった。それはファイルをコンパイルし、リンク時にエラーが発生します。 – eudoxos

関連する問題