使用传入的字符串形参来访问类型中的内容

C++: Using a string parameter passed in to access something in a type

本文关键字:访问类型 字符串 形参      更新时间:2023-10-16

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

我要做的是:

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

我正在尝试对某个类型中的东西调用某个函数。例如,我在其他文件中的代码可能看起来像:

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

然而,以这种方式使用myString不起作用。如果myString持有值"class1",那么我希望callFunctionOn部分被解释为

callFunctionOn(OuterType::InnerType::class1);

我觉得这是超级简单,但我已经编程一整天了,我的大脑变得很累…

SOLVED:看起来为了以这种方式做到这一点,我需要一种具有反射的语言。为了解决这个问题,我采用了一种不同的方法,将指针传递给类。

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

当然,指针的类型可能需要改变,以满足您的应用程序的要求。

您正在尝试访问基于包含其名称的运行时字符串的变量?这是不可能的;变量的名称在编译和链接后消失。(除非为了方便调试而保留它们)。

你的意思是:

OuterType::InnerType::callFunctionOn(myString);

可能是这样的想法:operator()可以接受形参,将其包装在类行中可以根据其形参在重载的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。

这允许您使用default(如果没有找到键)或其他您希望的逻辑。