在C++中,如何在不重复编写具有相似类型的函数的情况下处理它们的最佳方法

编程语言 2026-07-09

我有一个C++函数,大致长这样:

double BigFunction(double (*func)(double), double var)
{
    // calculations that only use "var" variable
    double var3 = func(var2);
    return var3;
}

在这里,BigFunction() 接受 funcvar 作为输入并返回 var3。现在,假设 func 函数需要一个额外的 para 数组作为参数。为了实现这一点,我必须复制并粘贴整个 BigFunction(),并将 para 参数按如下所示传递:

double BigFunction(double (*func)(double, double *), double var, double *para)
{
    // calculations that only use "var" variable
    double var3 = func(var2, para);
    return var3;
}

请注意,除了下面这两行,BigFunction 中的其他内容都没有变化。我还有其他 func,需要一些额外的参数,因此对于每种 func,我都必须定义 BigFunction。有没有办法修改 BigFunction 以适配所有类型的 func

解决方案

你可以写一个变参函数模板,参数既可以是一个 double,也可以是一个 double 和一个 double* 作为参数:

#include <functional>   // invoke
#include <type_traits>  // is_invocable_r_v, conjunction_v
#include <utility>      // forward

template <class Func, class... Ts>
    requires(std::is_invocable_r_v<double, Func, double, Ts...> &&             // 1
             std::conjunction_v<std::is_same<double*, std::decay_t<Ts>>...> && // 2
             sizeof...(Ts) <= 1)                                               // 3
double BigFunction(Func&& func, double var, Ts... rest) {
    return std::invoke(std::forward<Func>(func), var, rest...);
}

约束条件1-3确保如下:

  1. 函数 func 可以用给定的参数 doubleTs... 调用,无论 Ts... 包含的类型是什么,并且它返回一个 double
  2. 所有 Ts... 会衰减为 double*
  3. Ts... 中至多只有一个参数。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章