存储并访问表中的不同成员功能
Storing and accessing different member functions in a table
我想将各种成员功能保存在表中,类似于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::variant
和std::any
。变体是标记联盟的实现。它可用于从预定义的类型列表中存储对象。any
是void*
的类型安全包装器。它可以存储任何任何类型的对象。因此,可能是您要寻找的变体或any
的地图。
它们只是低级工具,对于更精美的异质处理,有现有库,例如boost.hana。
相关文章:
- 类模板的成员功能的定义在单独的TU中完全专业化
- 升压信号2将插槽传递到成员功能以断开连接
- 多次实现成员功能
- 私有成员数据不可用于公共成员功能
- 如何避免大多数成员功能相同的代码重复
- C 成员功能
- =删除用户定义的成员功能,除了构造函数,分配运算符C 11
- C 朋友课程和朋友成员功能
- C 函数调用包装器包含类成员功能作为模板参数
- 创建类成员功能
- 成员功能C 的不同实现
- 返回类型不可知模板类成员功能
- C 11螺纹 - 非静态成员功能的使用无效 - 工作GCC 5.1.0损坏的GCC 7.3.1
- 超载类成员功能标记为const
- C 功能指针和成员功能指针
- 将非静态成员函数C 的使用无效,而将成员功能作为函数变量
- 我可以使用Priority_queue的基础容器的成员功能
- 如何子类可运行任何成员功能
- 共享类时如何隐藏成员功能文件
- 从C文件访问C 类成员功能