别名模板和令人困惑的语法

时间:2018-06-23 01:29:26

标签: c++ templates

我从https://en.cppreference.com/w/cpp/language/type_alias

的下面复制了代码块
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

我不了解其中的某些方面,例如我们:

template<typename...>为什么在参数列表中未定义名称类型?

void_t<typename T::foo> f();为什么调用f()而不是声明?

这部分是什么意思? void_t<typename T::foo>

2 个答案:

答案 0 :(得分:1)

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

是模板别名,typename...表示任意数量的类型。 结果类型为void

template<typename T> void_t<typename T::foo> f();

是一个函数声明。 返回类型为void_t<typename T::foo>,所以void 但是 如果T::foo不是有效的类型,则感谢SFINAE,该重载将被丢弃。

答案 1 :(得分:0)

  

为什么名称类型没有在参数列表中定义?

省略号可以在模板和/或参数列表中。前者称为 variadic模板,后者称为 variadic函数。那有什么区别?

可变参数模板允许您将任意数量的类型传递给函数,而可变参数函数允许您将任意数量的自变量传递给函数。如果您希望函数采用任意数量的参数类型,则可以同时使用它们。

  

为什么调用f()而不是声明?

f()函数声明。我想它确实看起来令人困惑。可以将其视为f(void)