使用模板的条件函数调用

Conditional function invocation using template

有没有一种方法可以使用 C++ 模板(编译时代码生成)有条件地调用函数,其中根据参数的类型,每个变体的逻辑都会不同

例如(不可编译的代码),

template <true, typename Var1, typename Var2, typename Var3>
int func(Var1 v1, Var2 v2, Var3 v3) {//logic type1}

template <false, typename Var1, typename Var2, typename Var3>
int func(Var1 v1, Var2 v2, Var3 v3) {//logic type2}

template <typename Var1, typename Var2, typename Var3>
int foo(Var1 v1, Var2 v2, Var3 v3)
{
    func<static_condition>(v1, v2, v3);
}

当使用一些参数调用 foo 时,它将静态评估布尔标志,它应该根据它调用 func。在这两个变体中执行的逻辑将导致编译错误,因此必须为每个操作拆分。

我正在搜索一些示例并使用模板元编程找到了 _If _Then _Else 模式,但我不清楚如何在我的场景中使用它。

没有什么比这更容易了。

template <typename Var1, typename Var2, typename Var3>
int func(Var1 v1, Var2 v2, Var3 v3, std::true_type) {//logic type1}

template <typename Var1, typename Var2, typename Var3>
int func(Var1 v1, Var2 v2, Var3 v3, std::false_type) {//logic type2}

template <typename Var1, typename Var2, typename Var3>
int foo(Var1 v1, Var2 v2, Var3 v3)
{
    func(v1, v2, v3, std::integral_constant<bool, static_condition>());
}

您可以使用enable_if有条件地关闭一个或另一个功能:

template <bool cond, typename Var1, typename Var2, typename Var3>
typename std::enable_if<cond, int>::type
func(Var1 v1, Var2 v2, Var3 v3) {//logic type1}

template <bool cond, typename Var1, typename Var2, typename Var3>
typename std::enable_if<not cond, int>::type
func(Var1 v1, Var2 v2, Var3 v3) {//logic type2}

template <typename Var1, typename Var2, typename Var3>
int foo(Var1 v1, Var2 v2, Var3 v3) {
    func<static_condition>(v1, v2, v3);
}