如何创建存储函数指针(含类成员函数)的std::tuple
函数指针与成员函数指针的Tuple存储方案
一、普通函数指针的Tuple正确写法
你之前的typedef语法有误,C++里函数指针的标准声明格式是返回值类型(*指针名)(参数列表)。针对接收Obj、返回bool的普通函数,正确的类型定义和tuple声明如下:
#include <tuple> class Obj; // 先做类的前向声明 // 单个普通函数指针的类型别名 using PlainFuncPtr = bool(*)(Obj); // 存储两个该类型指针的tuple using FuncPair = std::tuple<PlainFuncPtr, PlainFuncPtr>;
比如你有两个符合要求的普通函数:
bool checkObj1(Obj obj) { return true; } bool checkObj2(Obj obj) { return false; }
可以这样初始化tuple:
FuncPair myFuncs = std::make_tuple(checkObj1, checkObj2);
二、成员函数指针的Tuple存储
成员函数指针的语法和普通函数不同——成员函数必须依附于类的实例,所以类型声明要带上类名,格式为返回值类型(类名::*)(参数列表)。针对Obj的私有成员函数func1、func2,具体步骤如下:
1. 定义成员函数指针类型
// Obj类的成员函数指针(无参数,返回bool) using MemFuncPtr = bool(Obj::*)(); // 存储两个成员函数指针的tuple using MemFuncPair = std::tuple<MemFuncPtr, MemFuncPtr>;
2. 获取私有成员函数指针
因为func1、func2是私有成员,外部直接取&Obj::func1会编译报错,有两种解决方式:
- 在类内部提供获取接口:
class Obj { private: bool func1() { return true; } bool func2() { return false; } public: // 静态方法返回包含私有成员函数指针的tuple static MemFuncPair getPrivateFuncs() { return std::make_tuple(&Obj::func1, &Obj::func2); } };
调用时直接用Obj::getPrivateFuncs()就能拿到目标tuple。
- 声明友元允许外部访问:
如果必须在类外创建tuple,可以把创建代码声明为Obj的友元:
class Obj; using MemFuncPair = std::tuple<bool(Obj::*)(), bool(Obj::*)()>; class Obj { private: bool func1() { return true; } bool func2() { return false; } // 友元函数可以访问私有成员的指针 friend MemFuncPair createMemFuncTuple(); }; MemFuncPair createMemFuncTuple() { return std::make_tuple(&Obj::func1, &Obj::func2); }
三、统一包装普通函数和成员函数(可选)
如果需要在同一个tuple里混合存储普通函数和成员函数,建议用std::function做统一包装,这样不用区分两种指针类型:
#include <functional> // 统一包装成接收Obj实例、返回bool的函数类型 using UnifiedFunc = std::function<bool(Obj&)>; using UnifiedFuncTuple = std::tuple<UnifiedFunc, UnifiedFunc>;
包装示例:
// 普通函数示例 bool plainCheck(Obj& obj) { return true; } // 成员函数包装 Obj myObj; UnifiedFuncTuple mixedTuple = std::make_tuple( UnifiedFunc(plainCheck), // 用lambda绑定实例 UnifiedFunc([&myObj](Obj&) { return myObj.func1(); }) ); // 或者用std::bind绑定成员函数和实例 UnifiedFunc memFuncWrapper = std::bind(&Obj::func1, &myObj);
内容的提问来源于stack exchange,提问作者Mr.Barbo
相关产品推荐
相关产品推荐

