使用传入的字符串形参来访问类型中的内容
C++: Using a string parameter passed in to access something in a type
我的目标是访问一个作为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::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
当然,指针的类型可能需要改变,以满足您的应用程序的要求。
您正在尝试访问基于包含其名称的运行时字符串的变量?这是不可能的;变量的名称在编译和链接后消失。(除非为了方便调试而保留它们)。
你的意思是:
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(如果没有找到键)或其他您希望的逻辑。
相关文章:
- 错误:请求从"常量字符 [5]"转换为非标量类型"字符串"
- 为什么没有访问所有字符串字符?
- 循环访问资源字符串表
- 类型字符串::长度()。我得到了"Unable to resolve identifier length"
- 用指针访问std ::字符串中的元素
- 如何掩盖对象数组的数据类型字符串到C 中的INT
- 解析参数值 - 字符串和链接值(类型字符串的链接值)与(特定类型的)变量
- C 中的枚举类型字符串类别
- 派生类的访问类型
- 返回对位字段的访问类型
- 与基本面作斗争.特别是字符[],字符*和从数组中读取.也许我应该使用类型字符串
- 矢量类型 字符串,但当用整数初始化时
- 如何从const char *类型字符串中删除新线字符
- 在 c++ 中将 ostream 分配给数据类型字符串
- Linux 编译错误 - 无法将类型"字符串"转换为类型"字符串&&"
- 在不键入别名类型的完整声明的情况下,无法从类模板定义中访问类型的类型别名
- LPCSTR 类型字符串出现乱码或显示错误
- C 表达式必须具有类型 - 字符串到const char*
- 将值分配给字符类型字符串
- 使用传入的字符串形参来访问类型中的内容