C ++:使用传入的字符串参数来访问类型中的某些内容

时间:2011-08-16 00:27:03

标签: c++ types parameters namespaces

我的目标是访问作为myFunction内部参数传入的类。

这是我正在尝试做的事情:

void myFunction(string myString)
{
   callFunctionOn(OuterType::InnerType::myString);
}

我正试图在某种类型的东西上调用某些函数。例如,我在其他文件中的代码可能如下所示:

namespace OuterType {
namespace InnerType {
//stuff here
}
}

但是,以这种方式使用myString不起作用。如果myString保存值“class1”,那么我希望将callFunctionOn部分解释为

callFunctionOn(OuterType::InnerType::class1);

我觉得这很简单,但我整天都在编程,我的思绪变得疲惫......

解决:看起来就像这样,我需要一种带反射的语言。为了解决这个问题,我对问题采取了不同的方法,并将指针传递给了该类。

4 个答案:

答案 0 :(得分:6)

C ++没有内置的反射,但它确实有指向数据,函数和类成员的指针。因此,您可以使用std::mapunordered_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开销。

这允许你有默认值,如果没有找到键,或者你想要的其他逻辑。