You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现可存储含N个double类型参数函数对象的C++类模板?

实现接受N个double参数的函数对象存储类模板

要实现能恰好存储接受N个double类型参数、返回int的函数对象的类模板,我们可以借助C++标准库的std::make_index_sequence来简洁生成对应参数列表的std::function类型,无需复杂的嵌套模板结构。

完整实现代码

#include <functional>
#include <utility>
#include <cassert>

// 辅助模板:生成对应N个double参数的std::function类型
template<int N, typename = std::make_index_sequence<N>>
struct FunctionTypeHelper;

template<int N, size_t... Is>
struct FunctionTypeHelper<N, std::index_sequence<Is...>> {
    // 利用索引序列的长度生成恰好N个double参数的函数签名
    using type = std::function<int(decltype((void)Is, double{})...)>;
};

template<int N>
class FunctionHolder {
public:
    using function_type = typename FunctionTypeHelper<N>::type;

    // 构造函数:直接存储函数对象(避免引用悬空问题)
    explicit FunctionHolder(function_type func) : m_func(std::move(func)) {}

    // 重载调用运算符,方便直接调用存储的函数
    int operator()(double... args) const {
        static_assert(sizeof...(args) == N, "传入的参数数量必须与模板参数N一致");
        return m_func(args...);
    }

private:
    function_type m_func;
};

// 测试用函数
int my_func(double arg1, double arg2) {
    return static_cast<int>(arg1 + arg2);
}

int main() {
    FunctionHolder<2> my_holder(my_func);
    assert(my_holder(1.2, 3.8) == 5); // 验证调用结果
    return 0;
}

实现说明

  1. 辅助模板FunctionTypeHelper:通过std::make_index_sequence<N>生成一个包含N个索引的序列,利用模板展开特性,将索引序列的长度映射为N个double类型的参数,最终得到std::function<int(double, double, ...)>(共N个double)的类型。
  2. FunctionHolder类:
    • 定义function_type为辅助模板推导的函数类型,清晰直观。
    • 构造函数采用值传递并通过std::move转移所有权,避免了引用存储可能导致的悬空问题。
    • 重载operator(),并通过static_assert在编译期检查传入参数的数量是否与N匹配,提前发现错误。

内容的提问来源于stack exchange,提问作者Adam Ryczkowski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 09:55:22