【问题标题】:Giving Variadic Template Pack as function specification提供可变参数模板包作为功能规范
【发布时间】:2016-07-05 13:45:24
【问题描述】:

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

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&lt;TT...&gt;(); 它会产生对重载函数的模棱两可的调用,我已经设法通过给函数UpdateStuff() 参数使其工作像UpdateStuff(T first, TT... second) 和专业化只有一个UpdateStuff(T first) 但我想知道如果没有函数参数这是否可能,我将总结一下我的问题:

  • 我不完全明白为什么UpdateStuff&lt;TT...&gt;(); 不起作用,如果TT 在编译时只是double 为什么不使用第一个函数?
  • 是否可以在没有函数参数的情况下完成我想要完成的任务?

提前致谢,如果您不理解与我的问题相关的内容,我会很感激能更好地解释它,并为我糟糕的英语感到抱歉。

【问题讨论】:

  • 我的猜测是UpdateStuff&lt;double&gt;(); 将匹配UpdateStuff 函数的两个重载,因为TT 将在那里被推断为一个空包...

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


【解决方案1】:

是的,这是可能的。

但是考虑到typename ... TT 是“零个或多个类型名”,所以调用UpdateStaff&lt;double&gt;() 两个版本的UpdateStaff() 都可以。

例如,您可以在非最终版本中强加第二种类型;像这样的

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

    UpdateStuff<T2, TT...>();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 2018-07-02
    相关资源
    最近更新 更多