2016-10-03 39 views
0

我要讓類模板的構造default,如果它是瑣碎和默認T,這樣的事情:選擇類的構造函數

template <typename T> 
class my_class { 
public: 
    template <typename <std::enable_if<std::is_trivially_default_constructible<T>::value, int>::type = 0> 
    constexpr my_class() = default; 

    template <typename <std::enable_if<!std::is_trivially_default_constructible<T>::value, int>::type = 0> 
    constexpr my_class() {}; 
} 

當然,這個代碼不工作(空參數,如果條件不滿足)。怎麼做?

回答

2

可以提供時T是獨立的專業化和不平凡的默認constructible:

template <typename T, bool = std::is_trivially_default_constructible<T>::value> 
class my_class { 
public: 
    constexpr my_class() = default; 
}; 

template <typename T> 
class my_class<T, false> { 
public: 
    constexpr my_class() {}; 
}; 
+0

試想一下,'my_class'是一個非常大的類(100+方法),這樣做我需要複製所有這些都是專業化? – vladon

+0

@ vladon是的,你會的。無論如何你確定你需要這個嗎? 'my_class'中存儲了一個'T'類型的對象嗎?你是否只在'T'是?時才使'my_class'變得可以構造? – TartanLlama

+0

是的,我在'my_class'中存儲'T'類型的對象,並且是的,如果T是簡單的默認可構造的,我想使它變得可以默認構造。 – vladon