是否可以通过传递相同的参数包来调用具有不同数量参数的函数

硝酮

例如说我有两个简单的功能:

void a(int x)
{
    //do something with x
}

void b(int x, float y)
{
    // do something with x and y
}

我希望有一个带有可变数量args的单个函数,可以基于一个标志调用上述两个函数:

template<typename... Args>
void varArgs(bool a_or_b, Args... args)
{
    if (a_or_b)
        a(args...);
    else
        b(args...);
}

该标志将告诉我们我们要使用第一个功能还是第二个功能,但是由于模板是在编译时实例化的,因此将无法使用。我已经读过,constexpr if但是我只能使用c ++ 14,所以我想知道是否还有其他选择?

编辑:布尔可以是一个编译时间常数,而不是运行时参数。

尼尔·弗里德曼

您可以做的任何事情constexpr if,都可以使用标签分发。看起来像这样:

void a(int x)
{
    //do something with x
}

void b(int x, float y)
{
    // do something with x and y
}

template <typename ... Args>
void callImpl(std::true_type, Args && ... args) {
    a(std::forward<Args>(args)...);
};

template <typename ... Args>
void callImpl(std::false_type, Args && ... args) {
    b(std::forward<Args>(args)...);
};

template<bool callA, typename... Args>
void varArgs(Args&&... args)
{
    callImpl(std::integral_constant<bool, callA>{}, std::forward<Args>(args)...);
}

int main() {
    varArgs<true>(0);
    varArgs<false>(0, 0.0);
}

这里的想法是,从varArgs的调用callImpl将根据布尔值的不同而分派。为此,我们需要将布尔值提升为其他类型,这就是为什么我说布尔值必须是模板参数而不是值。实时示例:http//coliru.stacked-crooked.com/a/6c53bf7af87cdacc

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

调用具有不同数量参数的函数

是否可以通过伪泛型函数指针来调用具有不同原型的函数?

CMAKE:重复调用具有不同参数的函数会得到相同的结果

如何调用具有不同类作为参数的函数

是否可以使用JSFuck约定调用具有2个或更多参数的函数?

Flask api每次使用具有不同api输入参数的函数调用都返回相同的输出

是否可以推迟对具有不同数量/类型的参数的函数文字进行求值?

如何从类似的函数调用具有可变数量的参数的函数?

如何通过更改引用传递的参数来对调用具有副作用的函数的方法进行单元测试?

如何通过导出导出相同的函数但具有不同的参数

具有许多按钮的jQuery调用具有不同参数的函数

具有不同数量参数的Haskell函数

如何使函数具有不同数量的参数

从修改默认值的函数调用具有不同默认参数的多个函数

ghci编译器优化:两次调用具有相同参数的函数

找到一种在 C 中调用具有不同参数的函数的方法

如何多次调用具有不同参数的函数成员?

从Powershell调用具有不同参数计数的VBA函数

是否可以将具有相同返回类型但参数不同的函数发送给另一个函数?

通过反射调用具有命名参数的方法

通过PerformSelector iOS调用具有多个参数的方法

从JavaScript中的对象调用具有正确参数的函数

Haskell使用map调用具有多个参数的函数

在Python中调用具有参考参数的.Net函数

调用具有较少参数的C函数?

使用反射调用具有默认参数值的函数

在 Sinon 中假调用具有特定参数的函数

调用具有多个参数值的模板函数

调用具有多个数组参数的函数