2014-03-06 35 views
4

假設我有以下模板:模板偏特性狀

template <typename T> union example { 
    T t; 

    constexpr example(const T & t) : t(t) {}; 

    /* We rely on owning class to take care 
    * of destructing the active member */ 
    ~example() {}; 
}; 

因爲析構函數存在的,example<T>絕不會平凡破壞(因此沒有,也就是說,一個文本類型)。我倒是喜歡有一個偏特像

template <typename T> union 
    example<std::enable_if_t<std::is_trivially_destructible<T>::value, T>> { 
    T t; 

    constexpr example(const T & t) : t(t) {}; 
}; 

example<T>是平凡破壞時T是,但不幸的是,讓我的(合理的,事後)警告

警告:類模板部分特化包含無法推導出的模板 參數; 這部分專業化將永遠不會使用

那麼有沒有什麼辦法得到我想要的東西?

+0

爲什麼你需要明確寫出dtor?你不能'=默認'嗎? (或者這是不可能的,如果它的隱式定義將被刪除?) – dyp

+0

唉,'= default'設置刪除析構函數,如果'T'不是一般的可破壞的,至少在3.4節。 –

+1

@dyp:這對工會來說沒有意義。見9.5/2:析構函數必須是用戶提供的。 –

回答

6

也許與第二,默認的模板參數?

#include <type_traits> 
#include <iostream> 

template <typename T, bool = std::is_trivially_destructible<T>::value> 
union example { 
    T t; 

    constexpr example(const T & t) : t(t) {}; 

    /* We rely on owning class to take care 
    * of destructing the active member */ 
    ~example() { std::cout << "primary template\n"; } 
}; 

template<typename T> 
union example<T, true> { 
    T t; 

    constexpr example(const T & t) : t(t) {}; 
}; 


struct nontrivial 
{ 
    ~nontrivial() { std::cout << "woot!\n"; } 
}; 

int main() 
{ 
    example<nontrivial> e1{{}}; 
    example<int> e2{{}}; 
} 
+0

完美,謝謝! –