在这种情况下,“ typename ...”是什么意思?

时间:2020-01-03 08:41:09

标签: c++ templates typename

我在cppreference.com中找到了一些我不理解的代码。 这里是链接:Type Alias。这是我不了解的dependent template-id。 这是代码:

//When the result of specializing an alias template is a dependent template-id, 
//subsequent substitutions apply to that template-id:

template<typename...>
using void_t = void;
template<typename T>
void_t<typename T::foo> f();
f<int>();     // error, int does not have a nested type foo

当我在VS 2019上悬停它时,它说 void_t<<未命名>...>

有人可以向我解释这个未命名的类型名有什么用吗?

3 个答案:

答案 0 :(得分:4)

这是一个没有名称的模板包,因为未使用。您可以传递任何类型,结果将相同。

答案 1 :(得分:1)

template<typename...>
using void_t = void;

它允许您将模板参数传递给它,它将耗尽所有参数,从而得到相同的类型。对SFINAE有用

答案 2 :(得分:1)

让我尝试解释一下, 表达式template<typename...> using void_t = void;的类型推导为void,而与传递的模板参数无关。 例如,

template<typename...>
   using void_t = void;

template <typename T>
void_t<T> fun1() {
    std::cout << "fun1 called" << std::endl;
}

int main() {
    fun1<int>();   //fun1 called
    fun1<float>(); //fun1 called
}

要进行相同的扩展,template<typename T>void_t<typename T::foo> f();仅接受嵌套类型为typename T的{​​{1}}。例如,

T::foo

有关更多信息,请参见Substitution failure is not an error