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

如何创建存储函数指针(含类成员函数)的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:53:16