我的目标是访问作为myFunction内部参数传入的类。
这是我正在尝试做的事情:
void myFunction(string myString)
{
callFunctionOn(OuterType::InnerType::myString);
}
我正试图在某种类型的东西上调用某些函数。例如,我在其他文件中的代码可能如下所示:
namespace OuterType {
namespace InnerType {
//stuff here
}
}
但是,以这种方式使用myString不起作用。如果myString保存值“class1”,那么我希望将callFunctionOn部分解释为
callFunctionOn(OuterType::InnerType::class1);
我觉得这很简单,但我整天都在编程,我的思绪变得疲惫......
解决:看起来就像这样,我需要一种带反射的语言。为了解决这个问题,我对问题采取了不同的方法,并将指针传递给了该类。
答案 0 :(得分:6)
C ++没有内置的反射,但它确实有指向数据,函数和类成员的指针。因此,您可以使用std::map
或unordered_set
查找具有特定名称的指针(您必须事先将所有名称/指针对添加到地图中)。
您的解决方案可能类似于:
namespace Outer
{
namespace Inner
{
void funcA( void ) { std::cout << "called funcA" << std::endl; }
std::map< std::string, void (*)(void) > members;
}
}
// in some initialization function
Outer::Inner::members["funcA"] = &Outer::Inner::funcA;
// later
std::string myString = "funcA";
void (*f)(void) = Outer::Inner::members[myString]; // lookup function by name
(*f)(); // call function via its pointer
当然,指针的类型可能需要更改以满足您的应用程序要求。
答案 1 :(得分:3)
您是否尝试根据包含其名称的运行时字符串来访问变量?那是不可能的;编译和链接后,变量名称消失。 (除非它们被保留以便于调试)。
答案 2 :(得分:0)
你的意思是:
OuterType::InnerType::callFunctionOn(myString);
答案 3 :(得分:0)
也许这个想法:operator()可以接受参数,将它包装在类ine中可以根据其参数调用在重载的operator()中解析的调用。
template<typename TypeSig, class InstanceOf, typename NA,typename Args>
class FuncMap {
public:
typedef TypeSig (InstanceOf:: *cbMethod) ( NA, Args );
FuncMap( InstanceOf & cInst, cbMethod cbM ) : mcInst(cInst) {mcbM = cbM;}
TypeSig operator() ( NA na, Args args) {return (mcInst.*mcbM)(na, args);}
private:
InstanceOf & mcInst;
cbMethod mcbM;
};
您需要构建一个运行时字符串值的映射,作为实例方法的键和指针,如上所示。我使用它来进行重新调度跟踪和自定义运行时调度,而不是RTTI开销。
这允许你有默认值,如果没有找到键,或者你想要的其他逻辑。