存储并访问表中的不同成员功能

Storing and accessing different member functions in a table

本文关键字:成员 功能 访问表 存储      更新时间:2023-10-16

我想将各种成员功能保存在表中,类似于sol2库。

具有不同返回值和不同参数的不同类的成员函数。是否可以将这些成员功能存储在C 下的表中并稍后执行?我怀疑SOL2库(C LUA绑定)存储在std :: tuple中。但是我还没有弄清楚如何执行功能。

这是示例代码,可以更好地理解以下问题:

// various classes with different member functions
struct classA
{
    void function_a() {}
    bool function_b( int nValue1 ) {}
    int function_c( int nValue1, int nValue2 ) {}
};
struct classB
{
    int function_a() {}
    void function_b( int nValue1 ) {}
    bool function_c( int nValue1, int nValue2 ) {}
};

struct FunctionTable
{
    // function to store a memberfunction with a object instance
    template<class T, class ... Args>
    void addFunction( std::string strFunctionName, T * t, Args ... args )
    {
        // how to store the function pointer?
    }
    // function for returning the stored function pointer
    ? ? ? get(std::string strFunctionName)
    {
        return m_mapFunctions[strFunctionName];
    }
    // how to store the pointers in a container, e. g. std::map?
    std::map<std::string, ? ? ? > m_mapFunctions;
};
void main2()
{
    classA a;
    classB b;
    FunctionTable functionTable;
    // store different member functions in to the function table with a name as index
    functionTable.addFunction( "classA_function_a", &a, &classA::function_a );
    functionTable.addFunction( "classA_function_b", &a, &classA::function_b );
    functionTable.addFunction( "classA_function_c", &a, &classA::function_c );
    functionTable.addFunction("classB_function_a", &b, &classB::function_a);
    functionTable.addFunction("classB_function_b", &b, &classB::function_b);
    functionTable.addFunction("classB_function_c", &b, &classB::function_c);

    // Example calls
    auto functionA = functionTable.get("classA_function_a");
    functionA();
    auto functionB = functionTable.get("classA_function_b");
    bool bReturnValue = functionB(99);
    auto functionC = functionTable.get("classA_function_c");
    int nReturnValue = functionC(23, 24);
}

有人有想法还是暗示如何实现?

c 是一种静态打字的语言。地图是同质的:地图的所有元素都具有完全相同的类型。

指向一种类型函数的指针是与指针到另一种函数类型的不同类型。函数的类型取决于其参数和返回类型。因此,在同一地图中不可能将指针存储到不同参数列表或返回类型的函数。

然而,"类型擦除"的技术允许模拟动态键入。C 标准库带有两个异构包装器:std::variantstd::any。变体是标记联盟的实现。它可用于从预定义的类型列表中存储对象。anyvoid*的类型安全包装器。它可以存储任何任何类型的对象。因此,可能是您要寻找的变体或any的地图。

它们只是低级工具,对于更精美的异质处理,有现有库,例如boost.hana。