繁体   English   中英

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

[英]Single template parameter pack for multiple variadic functions?

通常我们会做这样的事情来定义多个带有相同参数包的可变参数函数:

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);
}

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

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

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

如果您可以使用 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");

正如 Nathan Oliver 所观察到的那样,当函数的名称很重要且具有描述性(而不是简单的枚举)时,使用整数模板参数会给您一个松散的描述。

在这种情况下,您可以添加一个枚举值附加模板参数而不是int 带有枚举值的描述​​性名称。

某事如

enum funcId
 {
   a_complex_and_descriptive_func_id,
   another_complex_func_id,
   a_third_complex_func_id // , etc...
 }     

template <funcId Id, typename ... Pack>
void func (Pack ... params)
 {
   if constexpr ( a_complex_and_descriptive_func_id == id )
    { /* body of first function */ }
   else if constexpr ( another_complex_func_id == id )
    { /* body of second function */ }
   else if constexpr ( a_third_complex_func_id == id )
    { /* body of third function */ }
   // else // etc...
 }

然后电话变成

func<a_complex_and_descriptive_func_id>("abc");

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

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

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

现场样品

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM