提供 Variadic Template Pack 作为函数规范
Giving Variadic Template Pack as function specification
我正在尝试创建一个具有模板包特化(它没有参数)的函数,它会打印一条消息,直到函数特化使其打印其他内容的最后一条消息,然后停止。
因为我真的不好解释,这里我 post 我正在尝试做的代码:
template <typename T>
constexpr void UpdateStuff()
{
std::cerr << "I am the last one :D" << std::endl;
}
template< typename T ,typename... TT>
constexpr void UpdateStuff()
{
std::cerr << "I am NOT the last one :D";
UpdateStuff<TT...>();
}
int main()
{
UpdateStuff<int,double>(); // Should only print text twice
std::cin.get();
return 1;
}
作为第一个说明,我知道这不起作用,UpdateStuff<TT...>();
它会产生对重载函数的模糊调用,我已经设法让它工作了给函数 UpdateStuff()
参数,如 UpdateStuff(T first, TT... second)
和专业化只有一个 UpdateStuff(T first)
但我想知道如果没有函数参数这是否可能,我将总结我的问题:
- 我不完全明白为什么
UpdateStuff<TT...>();
不起作用,如果 TT 在编译时只是 double
为什么它不使用第一个函数?
- 是否可以在没有函数参数的情况下完成我想要完成的事情?
提前致谢,如果您不明白与我的问题相关的内容,我将不胜感激,可以更好地解释它,抱歉我的英语不好。
是的,有可能。
但是考虑到 typename ... TT
是 "zero or more typenames",所以调用 UpdateStaff<double>()
两个版本的 UpdateStaff()
都可以。
例如,您可以在非最终版本中强加第二种类型;像这样
template <typename T1, typename T2, typename... TT>
constexpr void UpdateStuff()
{
std::cerr << "I am NOT the last one :D";
UpdateStuff<T2, TT...>();
}
我正在尝试创建一个具有模板包特化(它没有参数)的函数,它会打印一条消息,直到函数特化使其打印其他内容的最后一条消息,然后停止。 因为我真的不好解释,这里我 post 我正在尝试做的代码:
template <typename T>
constexpr void UpdateStuff()
{
std::cerr << "I am the last one :D" << std::endl;
}
template< typename T ,typename... TT>
constexpr void UpdateStuff()
{
std::cerr << "I am NOT the last one :D";
UpdateStuff<TT...>();
}
int main()
{
UpdateStuff<int,double>(); // Should only print text twice
std::cin.get();
return 1;
}
作为第一个说明,我知道这不起作用,UpdateStuff<TT...>();
它会产生对重载函数的模糊调用,我已经设法让它工作了给函数 UpdateStuff()
参数,如 UpdateStuff(T first, TT... second)
和专业化只有一个 UpdateStuff(T first)
但我想知道如果没有函数参数这是否可能,我将总结我的问题:
- 我不完全明白为什么
UpdateStuff<TT...>();
不起作用,如果 TT 在编译时只是double
为什么它不使用第一个函数? - 是否可以在没有函数参数的情况下完成我想要完成的事情?
提前致谢,如果您不明白与我的问题相关的内容,我将不胜感激,可以更好地解释它,抱歉我的英语不好。
是的,有可能。
但是考虑到 typename ... TT
是 "zero or more typenames",所以调用 UpdateStaff<double>()
两个版本的 UpdateStaff()
都可以。
例如,您可以在非最终版本中强加第二种类型;像这样
template <typename T1, typename T2, typename... TT>
constexpr void UpdateStuff()
{
std::cerr << "I am NOT the last one :D";
UpdateStuff<T2, TT...>();
}