【问题标题】:Template pack expansion with functions模板包扩展功能
【发布时间】:2021-09-20 05:27:35
【问题描述】:

下面的代码按预期工作。

struct A 
{
    template<typename T>
    void do_real_stuff() {}

    template <typename... Types> 
    struct DoStuff;

    template <typename Head, typename... Tail>
    struct DoStuff<Head, Tail...>
    {
        DoStuff(A &base)
        {
            base.do_real_stuff<Head>();
            (base.do_real_stuff<Tail>(), ...);
        }
    };
};

struct A 允许我这样称呼它:

A a;
DoStuff<int,double,string>(a);

但我不明白为什么我不能使用相同的模式来处理函数而不是结构。

struct B 
{
    template<typename T>
    void do_real_stuff() {}

    template <typename... Types>
    void DoStuff();

    template <typename Head, typename... Tail>
    void DoStuff<Head, Tail...>()
    {
         do_real_stuff<Head>();
         (do_real_stuff<Tail>(), ...);
    }
};

因为我想这样称呼它:

A a;
a.DoStuff<int,double,string>();

【问题讨论】:

    标签: c++ templates variadic-templates c++20


    【解决方案1】:

    您不能部分专门化函数模板 - 只能是类模板。

    但在此示例中,您实际上不必这样做。您已经在使用 fold-expression,只需包含第一种类型:

    struct B 
    {
        template<typename T>
        void do_real_stuff() {}
    
        template <typename... Types>
        void DoStuff()
        {
             (do_real_stuff<Types>(), ...);
        }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-22
      • 2015-08-22
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 2019-01-28
      相关资源
      最近更新 更多