多个可变参数函数的单个模板参数包?
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);
};
现场样品
相关文章:
- 如何将可变参数模板转换为多个单个模板?(C++竞争编程调试模板)
- 关于如何在具有单个参数的变体构造中选择替代方案?
- std::bind,无法让具有单个参数的方法工作
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 多个可变参数函数的单个模板参数包?
- 如何将多个函数重载作为单个参数传递?
- 具有默认值的单个参数构造函数是否与默认构造函数相同?
- C++fmt库,只使用格式说明符格式化单个参数
- 是否可以使用模板类的单个参数将类型和该类型的指针传递给 c++ 模板类?
- 如何使用每个对象的单个构造函数参数动态分配C++对象数组?
- 从单个标志C++获取多个参数
- QuickSort方法仅使用单个向量作为C 中的输入参数
- 模板参数在具有相同数据类型的单个类型名的构造函数中不起作用
- 具有单个参数的布尔函数映射
- 单个功能中的多个参数包
- 如何在C++中使用单个模板参数传递两个 lambda 函数
- 在什么基础上,由单个元素组成的参数包的折叠表达式被转换为未加括号的表达式
- 当foo是接受单个模板参数的结构时,'foo<Type1, Types...>'是否合法?
- C++是否可以创建依赖于单个构造函数参数的派生类而不是bass类
- C 模板字符在单个tick中作为参数