说我有以下课程:(可能是元生成的)
class MyClass
{
public:
myMethod();
...
}
假设有一些事情:
1.) I have the class name from somewhere (let's pretend)
2.) I have the names of the class methods somewhere ( std::map< std::string, std::function> ... perhaps? )
所以...因为在运行之前我可能不知道myMethod()
的名称,有没有办法用std::string
来调用它?这假设我有一个存储在某处的类函数的名称。
MyClass example;
std::string funcName{ findMyMethod() };//get std::string name of myMethod
example.someHowRunMyMethodUsing_funcName_();
我知道C ++通常不适合类似内省的情况,但我想弄清楚这一点。
谢谢!
答案 0 :(得分:4)
如果您保持map
的{{1}} - >,则可以这样做std::string
。
member function pointers
以后
std::map<std::string, void (MyClass::*)()> functionMap;
functionMap["myMethod"] = &MyClass::myMethod;
答案 1 :(得分:3)
有很多种方法,但使用成员函数指针的映射可能是具有相同签名的方法中最常用的。
com.springsource.org.aopalliance-1.0.0.jar
支持不同的签名要困难得多。
然后你将基本上进入DIY运行时类型检查。
答案 2 :(得分:1)
在C ++中没有内置的通用方法。
你可以做的最接近的是使用C ++中的虚函数来实现“后期绑定”,但是在这种情况下你需要经历很多箍。
http://www.thegeekstuff.com/2013/06/cpp-virtual-functions/
它不像Ruby那样的高级语言支持“按名称调用”这么灵活。
在动态库/模块上下文中,您可以使用dlopen等函数进行更多选项,但这些选项在C中更易于使用。
答案 3 :(得分:1)
有COM @Override
public boolean onOptionsItemSelected(MenuItem item){
switch (item.getItemId()){
case R.id.action_reset:
Unsafe.uhs1a.setSelection(0);
Unsafe.uhs1b.setSelection(0);
Unsafe.uhs1c.setSelection(0);
Precondition.phs1a.setSelection(0);
Precondition.phs1b.setSelection(0);
Precondition.phs1c.setSelection(0);
case R.id.action_about:
Fragment newFragment = new TheFragmentYouWantToOpen();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.frame_container, newFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
//frame_container is the id of the container for the fragment
return true;
default:
return super.onOptionsItemSelected(item);
}
接口,它实现了完全相同的功能,因此您可以创建自己的模拟此接口并将其与您的类一起使用。
IDispatch