我正在阅读有关enable_if on cppreference的参考资料。在示例部分中。我对代码中的模板声明有疑问:
// #4, enabled via a template parameter
template<class T,
typename std::enable_if<
!std::is_trivially_destructible<T>{} &&
(std::is_class<T>{} || std::is_union<T>{}),
int>::type = 0>
void destroy(T* t)
{
std::cout << "destroying non-trivially destructible T\n";
t->~T();
}
如果满足std :: enable_if()的条件。声明可以改写为:
template<class T, typename std::enable_if_t<true,int> = 0> // #1
由于enable_if的可能实现是:
template<class T>
struct enable_if<true, T> { typedef T type; };
#1等同于以下声明:
template<typename T, typename int = 0>
这是一份格式错误的陈述。编译器发出错误消息:
error: two or more data types in declaration of 'parameter'
template<typename T, typename int = 0>
我的问题是:在模板声明中理解typename std::enable_if_t<true,int> = 0
的正确方法是什么。
我遇到的一个类似问题是#4的示例 #5:
// #5, enabled via a template parameter
template<class T,
typename = std::enable_if_t<std::is_array<T>::value> >
void destroy(T* t) // note, function signature is unmodified
{
for(std::size_t i = 0; i < std::extent<T>::value; ++i) {
destroy((*t)[i]);
}
}
当满足enable_if()的条件时,声明应该类似于:
template<class T, typename = X > // X is a type name
如何编译typename=X
。
谢谢,
融