我想将各种成员函数保存在一个表中,类似于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);
}
有人有想法或提示如何实现的吗?
答案 0 :(得分:4)
C ++是一种静态类型的语言。地图是同质的:地图的所有元素都具有完全相同的类型。
指向一种类型的函数的指针与指向另一种函数类型的指针是不同的类型。函数的类型由其参数和返回类型确定。因此,不可能在同一映射中存储指向不同参数列表或返回类型的函数的指针。
但是,有一些用于“类型擦除”的技术,该技术可以模拟动态类型。 C ++标准库带有两个异构包装器:std::variant
和std::any
。 Variant是带标签的联合的实现。它可用于存储预定义类型列表中的对象。 any
是void*
的类型安全包装器。它可以存储 any 类型的对象。因此,您可能正在寻找变体或any
的地图。
尽管它们只是底层工具,而且对于更具特色的异构处理,还有现有的库,例如Boost.Hana。