提供Variadic模板包作为功能规范

时间:2016-07-05 13:45:25

标签: templates c++11 metaprogramming variadic-functions variable-templates

我正在尝试创建一个具有模板包特化的函数(它没有参数)并且它会打印一条消息,直到最后一个函数专门化使其打印其他内容,然后停止。 因为我真的很难解释,在这里我发布了我正在尝试做的代码:

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...>();它会产生对重载函数的模糊调用,我已经设法通过赋予函数{{ 1}}参数如UpdateStuff()和专精只有一个UpdateStuff(T first, TT... second)但我想知道如果没有函数参数这是可能的,我会给出我的问题摘要:

  • 我不完全理解为什么UpdateStuff(T first)不起作用,如果TT在编译时只是UpdateStuff<TT...>();,为什么它不使用第一个函数?
  • 是否可以在没有功能参数的情况下完成我想要完成的任务?

提前致谢,如果你不理解与我的问题有关的事情,我会很高兴能够更好地解释它,并为我糟糕的英语道歉。

1 个答案:

答案 0 :(得分:0)

是的,这是可能的。

但请记住,typename ... TT是“零个或多个类型名称”,因此调用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...>();
}