如何在C++自定义类中使用std::function式的函数类型模板参数?
如何定义接受函数类型作为模板参数的自定义类
你遇到的问题是对C++中函数类型作为模板参数的写法不熟悉,下面直接给你两种可行的实现方式:
方式一:直接接受完整函数类型作为模板参数
最简单的写法是把函数类型当作普通模板类型参数,不需要拆分返回值和参数:
template<typename Func> class SomeClass {}; // 使用示例 SomeClass<int(int, int)> obj; // 这里的int(int,int)就是完整的函数类型
这种写法很直观,只要传入合法的函数类型(比如void()、std::string(double, bool)等)就能正常使用。
方式二:像std::function那样拆分返回值和参数(模板特化)
如果你想和std::function一样明确区分返回值和参数类型,需要用模板特化实现:
首先定义空的主模板:
template<typename> class SomeClass;
然后针对函数类型进行特化,拆分返回值和参数:
template<typename Ret, typename... Args> class SomeClass<Ret(Args...)> { public: // 示例:模拟std::function的调用功能 Ret operator()(Args... args) const { // 这里可以添加实际调用逻辑,比如调用存储的可调用对象 return Ret{}; // 临时返回默认值,实际使用时替换为真实逻辑 } }; // 使用示例 SomeClass<int(int, int)> sum_wrapper; int result = sum_wrapper(1, 3); // 调用operator(),返回int类型
你的错误写法原因
你写的template<typename A(typename B)>是非法语法,C++模板参数不能直接以这种方式拆分函数类型。如果想要拆分返回值和参数,必须通过模板特化来实现,就像上面的方式二那样。
另外补充一点:lambda表达式能传给接受std::function的函数,是因为lambda可以隐式转换为对应的std::function类型,这也是std::function设计的便利特性之一。
内容的提问来源于stack exchange,提问作者Srinivas V
相关产品推荐
相关产品推荐

