2016-03-23 16 views
1

Şablon sınıfının belirli bir uzmanlığı için şablon kurucusu SADECE belirtilebilir mi? Bu kodu vardır:Şablon oluşturucuda şablon sınıfı uzmanlığı

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; 
} 

Ben ikinci yapıcı olmayan tek std :: fonksiyon parametrelerinin derlemek yapmaya çalışıyorum, ben açıkça T gerektiği derleyici anlatmak için bir yol bulmaya çalışıyorum yüzden Bu durumda geçersiz olmak, ama açıkçası bu derleme olmaz.

+0

Sizin durumunuzda, neden sadece int * 've' char * 'için aşırı yüklenme yapmıyoruz? – Jarod42

cevap

0

Sen SFINAE ve yapıcı ikinci parametre nedeniyle uzmanlaşmış edilemez std fonksiyonlu türleri için Şimdi varsayılan değer

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; 
} 

ek parametresini kullanabilirsiniz.

+0

güzel, teşekkürler! –