2017-01-10 6 views
1

エイリアス宣言にこれらのテンプレート、変革:私はC++ 11に変換してみましたこのような私は、コンパイル時定数に基づいて、いくつかのテンプレートを持っている

const int SIG0 = 0; 

template<int Sig> 
struct SignalPrototype; 

template<> 
struct SignalPrototype<SIG0> { 
    typedef std::function< void() > type; 
}; 

(私は信じて)エイリアス宣言を「expected unqualified-id before ‘using’ が、私はそれがテンプレートパラメータで何かを期待していると思いますが、私のことができます。エラーで

const int SIG0 = 0; 

template<int Sig> 
using SignalPrototype = std::function< void() >; 

template<> 
using SignalPrototype<SIG0> = std::function< void() >; 

:、私はそれがいかなる形(掲示それらのちょうど1)で動作させることができませんでしたそれは型ではないので、SIG0を入れてください。

メモ: 私はC++標準からC++ 17まで使用していますので、わからない新しいものもありがとうございます。

また、私はタイトルに「これら」が好きではありませんが、具体的な名前が何であるか分かりません。

答えて

3

ここで間違っていることがいくつかあります。 const int SIG0 = 0;constではなくconstexprである必要があります。 あなたはcannot specialize alias templatesです。主である(あるいは、それも読みやすさに役立つの - それは私の特定のコードに合う場合

constexpr int SIG0 = 0; 

template <int Sig> struct SignalPrototype; 
template<> struct SignalPrototype<SIG0> { 
    typedef std::function< void() > type; 
}; 

template <int Sig> 
using SignalPrototype_t = typename SignalPrototype<Sig>::type; 
+0

私は実際にそれを行うことができ、私は見てみましょう:

は何あなたができることは、このように二つのアプローチを組み合わせることです私が後にしているもの) – areuz

+1

@areuz C++ 14の 'std'名前空間には、C++ 11にはなかった' SignalPrototype_t'のようなエイリアスがたくさんあります。だから、人々はそれが役に立つと思うようです。私は 'typename'と' :: type'をいつも入力することを余儀なくされているので、私自身もそれを使います。 'type_traits'ヘッダの例をいくつか示します:http://en.cppreference.com/w/cpp/header/type_traits [概要]セクションを下にスクロールします。 – SU3

関連する問題