将类型分配到typename关键字

时间:2015-12-19 11:35:03

标签: c++ templates c++11 sfinae

我正在查看以下模板功能,并想知道当我们将enable_if类型分配到typename关键字时,幕后会发生什么:

template <typename T, typename = std::enable_if<std::is_pointer<T>::value>::type>
                    // ^^ What happens here?
void foo()
{
    std::cout << "T is a pointer!" << std::endl;
}

除了明显的SFINAE之外,编译器是否真的对它做了些什么呢?也许它会产生某种匿名类型?

由于

2 个答案:

答案 0 :(得分:3)

我假设您正在使用一个宽松的编译器,它不会在typename之后抱怨丢失的=关键字。

这是一个未命名的模板参数,否则将被忽略,以及默认模板参数,如果未指定其他模板参数,将使用该参数。

这意味着foo<void *>()解析为foo<void *, std::enable_if<std::is_pointer<void *>::value>::type>()foo<void *, void>()

这意味着foo<int>()将解析为foo<int, std::enable_if<std::is_pointer<int>::value>::type>(),但会被拒绝,因为std::enable_if<std::is_pointer<int>::value>没有任何type成员。

这意味着foo<int, int>()可以工作并打印“T是指针!”,因为如果明确指定了模板参数,则不使用默认参数。

最后一个意味着这可能不是一个好主意。

答案 1 :(得分:1)

不,我们未将enable_if类型分配给typename关键字,此处仅省略模板参数,因为它不会被使用:

template <typename T, typename Anonymous_Template_Parameter = std::enable_if<std::is_pointer<T>::value>::type>
//                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^

=std::enable_if<std::is_pointer<T>::value>::type>作为默认参数。