Templates 给出可变模板包作为功能规范

Templates 给出可变模板包作为功能规范,templates,c++11,metaprogramming,variadic-functions,variable-templates,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...

我试图创建一个具有模板包专门化(它没有参数)的函数,并打印一条消息,直到最后一个函数专门化使其打印其他内容,然后停止。 由于我解释得很糟糕,我在这里发布了我试图做的代码:

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;
}
模板
constexpr void UpdateStuff()
{
是的,这是可能的

但是考虑到
typename…TT
是“零个或多个typename”,所以调用
UpdateStaff()
两个版本的
UpdateStaff()
都是可以的

通过示例,您可以在非最终版本中强制第二种类型;类似于

template <typename T1, typename T2, typename... TT>
constexpr void UpdateStuff()
{
    std::cerr << "I am NOT the last one :D";

    UpdateStuff<T2, TT...>();
}
模板
constexpr void UpdateStuff()
{

我的猜测是,
UpdateStuff();
将匹配
UpdateStuff
函数的两个重载,因为
TT
将被推断为一个空包。。。