使用std :: string调用classes方法

时间:2015-07-10 04:06:11

标签: c++ c++11

说我有以下课程:(可能是元生成的)

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 ++通常不适合类似内省的情况,但我想弄清楚这一点。

谢谢!

4 个答案:

答案 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中更易于使用。

http://linux.die.net/man/3/dlopen

答案 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