2014-03-06 32 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

完美,谢谢! –