2016-09-08 7 views
2

おはようございます、使用する特殊なバリデーションテンプレート

バリデーションテンプレートを特殊化することに問題があります。私は、次のテンプレートを必要とする:

template<typename... Ts> 
using OPT = decltype(operator+(std::declval<Ts>()...))(Ts...); 

問題は、私は経由して、それを専門ので、私が試した

OTP<double,double> 

を使用しようとすると、これは、コンパイルされませんです

template<> 
using OPT<double,double> = double; 

しかし、今私はエラーが発生します

error: expected unqualified-id before ‘using’ 
using OPT<double,double> = double; 

誰かがこれを回避する方法を知っていますか、何か間違っていますか?

読んでいただきありがとうございます!

+0

打ち鳴らすには、より有用なエラーあなたの主なテンプレートを使用すると、 'OPTが'関数型を持つようにしたいように見えます – aschepler

+1

「エイリアステンプレートの明示的な特殊が許可されていない」が、その後、あなたを与えます特殊化を試みると 'OPT 'がスカラー型になりますか? – aschepler

+0

バリデーショナルテンプレートを特殊化し、クラスとエイリアスのメンバタイプを – jaggedSpire

答えて

2

エイリアステンプレートは特殊化することができず、自分自身を参照することができないため、実装するには構造体が必要です。

#include <utility> 

template<typename T, typename... Ts> 
struct sum_type { 
    using type = decltype(std::declval<T>() + std::declval<typename sum_type<Ts...>::type>()); 
}; 

template <typename T> 
struct sum_type<T> { 
    using type = T; 
}; 

template<typename... Ts> 
using OPT = typename sum_type<Ts...>::type; 

Demo.

関連する問題