c ++模板参数声明

时间:2017-11-16 00:12:41

标签: c++ templates typename

我正在阅读有关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

谢谢,

0 个答案:

没有答案