2016-03-23 7 views
1

テンプレートコンストラクタを指定することは可能ですかテンプレートクラスの特定の特殊化に対してのみ可能ですか? 私はこのコードを持っている:テンプレートコンストラクタでのテンプレートクラスの特殊化

template <typename T> 
class A { 
public: 
    A(std::function<T()> f) : x(f) {} 

    template <typename Y> 
    A<void>(Y* x) : x(x) {} 
private: 
    boost::variant<int*, char*, std::function<T()>> x; 
} 

私は2番目のコンストラクタは、私は明示的にそのTがすべきコンパイラに伝える方法を見つけようとしている理由です、唯一の非STD ::関数のパラメータ用にコンパイルしようとしていますこの場合には無効になりますが、明らかにこれはコンパイルされません。

+0

あなたのケースでは、 'int *'と 'char *'のオーバーロードだけをしないでください。 – Jarod42

答えて

0

あなたは、コンストラクタが原因二番目のパラメータに特化したことはできませんSTD-関数型のための今すぐ既定値で

template <typename T> 
struct is_std_function : public std::false_type {}; 

template <typename T> 
struct is_std_function<std::function<T> > : public std::true_type{};  

template <typename T> 
class A { 
public: 
    A(std::function<T()> f) : x(f) {} 

    template <typename Y> 
    A(Y* x, typename std::enable_if< !is_std_function<Y>::value >::type * = 0) : x(x) {} 
private: 
    boost::variant<int*, char*, std::function<T()>> x; 
} 

をSFINAEし、追加のパラメータを使用することができます。

+0

いいね、ありがとう! –

関連する問題