通常,我们将执行以下操作以使用相同的参数包定义多个可变参数:
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);
}
答案 0 :(得分:2)
C ++ 20之前的版本:不,您无法做任何事情来获得这样的语法。您能做的最好的事情就是创建一个宏,它可以为您完成很多工作。
C ++ 20:您可以将auto
用作函数参数类型,这是语法糖,用于像当前的lambda一样写出模板。那会给你
void func1(auto... params);
void func2(auto... params);
void func3(auto... params);
void func4(auto... params);
答案 1 :(得分:1)
尝试将它们包装在结构中。如果希望它们独立于任何对象状态,则应将它们声明为静态。
template <typename ...Pack>
struct FunctionHolder
{
static void func1(Pack... params);
static void func2(Pack... params);
};
答案 2 :(得分: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");
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");