2009-10-29 153 views
3

這個類:如果T沒有默認的構造函數我怎樣纔能有可選的默認構造函數?

template <class T> 
struct A { 
    A() : t(T()) { 
    } 

    A(const T& t_) : t(t_) { 
    } 

    T t; 
}; 

將無法​​編譯。 這一個:

template <class T> 
struct A { 
    A(const T& t_) : t(t_) { 
    } 

    T t; 
}; 

不會有哪怕T有默認的構造函數默認構造函數。我想要兩個 - 如果沒有T()我不想要A()。

我知道必須使用SFINAE。 Boost.traits和Boost.enable_if可以提供幫助,但我無法實現它。有人可以舉個例子來說明這個簡單的例子嗎?

+0

你要A()來對T稱,如果T沒有默認構造函數是什麼? – Mark 2009-10-29 23:42:00

+0

如果沒有T(),我完全不需要A()。 – 2009-10-29 23:43:24

+4

我可能會誤解,但是您確定第一個失敗*,如果您不嘗試使用缺省構造函數*的T的默認版本? GCC和Comeau都很好。你如何實例化課堂? – UncleBens 2009-10-29 23:44:45

回答

0

試試這個:

template <class T> 
struct A { 
    A(const T& t_ = T()) : t(t_) { 
    } 

    T t; 
}; 
1

類模板的成員函數,如果你調用它們只實例化。如果你從來沒有調用A::A(),然後調用T::T()的代碼不應該在此代碼編譯:

template <class T> 
struct A { 
    A() : t(T()) { 
    } 
    // ... 
}; 

你有這個麻煩?如果是這樣,你使用的是哪種編譯器?

這就是說,如果使用A代碼調用它的默認構造函數,然後我看到的是內A::A()移動T創建成一些特性類的唯一出路:

template< typename T > 
struct default_a_ traits { 
    static T default_construct() 
    { 
    return T(); 
    } 
}; 

template <class T, class Traits = default_a_traits<T> > 
struct A { 
    A() : t(Traits::default_construct()) { 
    } 
    // ... 
}; 

對於類沒有默認的構造函數,你可以提供一些traits類提供手段來創造一個T一些其他的方式:

struct my_special_traits_for_b { 
    static T default_construct() 
    { 
    return read_b_from_db(); 
    } 
}; 

typedef A<B, special_traits_for_b> AB; 
相關問題