如何实现可存储含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; }
实现说明
- 辅助模板
FunctionTypeHelper:通过std::make_index_sequence<N>生成一个包含N个索引的序列,利用模板展开特性,将索引序列的长度映射为N个double类型的参数,最终得到std::function<int(double, double, ...)>(共N个double)的类型。 FunctionHolder类:- 定义
function_type为辅助模板推导的函数类型,清晰直观。 - 构造函数采用值传递并通过
std::move转移所有权,避免了引用存储可能导致的悬空问题。 - 重载
operator(),并通过static_assert在编译期检查传入参数的数量是否与N匹配,提前发现错误。
- 定义
内容的提问来源于stack exchange,提问作者Adam Ryczkowski
相关产品推荐
相关产品推荐

