多个可变参数函数的单个模板参数包?

问题描述 投票:0回答:3

通常,我们会做类似的事情来定义多个使用相同参数包的可变参数函数:

template<typename ...Pack>
void func1(Pack... params);

template<typename ...Pack>
void func2(Pack... params);

template<typename ...Pack>
void func3(Pack... params);

template<typename ...Pack>
void func4(Pack... params);

是否有某种避免这种重复的方法?例如,类似:

template<typename ...Pack>
{
    void func1(Pack... params);
    void func2(Pack... params);
    void func3(Pack... params);
    void func4(Pack... params);
}
c++ templates variadic-templates
3个回答
2
投票

C ++ 20以前的答案:不,您无法做任何事情来获得这样的语法。您能做的最好的事情就是创建一个宏,为您完成很多工作。

C ++ 20:您可以将auto用作函数参数类型,这是语法糖,用于像现在编写lambda一样写出模板。那会给你

void func1(auto... params);
void func2(auto... params);
void func3(auto... params);
void func4(auto... params);

1
投票

尝试将它们包装在结构中。如果希望它们独立于任何对象状态,则应将它们声明为静态。

template <typename ...Pack>
struct FunctionHolder
{
    static void func1(Pack... params);

    static void func2(Pack... params);
};

LIVE SAMPLE


1
投票

[如果可以使用C ++ 17 ...也许可以定义一个函数,并使用一个附加的模板参数(该函数的编号,然后使用if constexpr分隔单个函数的主体。

我的意思如下

template <int Id, typename ... Pack>
void func (Pack ... params)
 {
   if constexpr ( 1 == id )
    { /* body of func1() */ }
   else if constexpr ( 2 == id )
    { /* body of func2() */ }
   else if constexpr ( 3 == id )
    { /* body of func3() */ }
   else // etc...
 }

调用func(),您必须显式表示整数模板参数

func<1>("abc"); // equivalent to func1("abc");
© www.soinside.com 2019 - 2024. All rights reserved.