Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建成员函数名并在运行时在c++;_C++_Boost_Reflection_Function Pointers_Mprotect - Fatal编程技术网

C++ 创建成员函数名并在运行时在c++;

C++ 创建成员函数名并在运行时在c++;,c++,boost,reflection,function-pointers,mprotect,C++,Boost,Reflection,Function Pointers,Mprotect,有人能告诉我这个问题的答案吗。我在互联网上搜索过这方面的信息,但无法获得我想要的更多信息 假设有一节课 class Foo { explicit Foo() {} int getVar1(); int getVar2(); void setVar1(int v); void setVar2(int v); private: int var1, var2; }; 现在给出一个标记列表{“var1”、“var2”、…“varN”},有没有办法在运行时创建函数名并

有人能告诉我这个问题的答案吗。我在互联网上搜索过这方面的信息,但无法获得我想要的更多信息

假设有一节课

class Foo {
  explicit Foo() {}

  int getVar1();
  int getVar2();

  void setVar1(int v);
  void setVar2(int v);

  private:
  int var1, var2;
};
现在给出一个标记列表{“var1”、“var2”、…“varN”},有没有办法在运行时创建函数名并调用Foo类型的某个对象的成员函数。比如说

Foo obj;
string input = "Var1,Var2,Var3,...VarN";
vector<string> tokens = splitString(input);
for (vector<string>::const_iterator it = tokens.begin(); it != tokens.end(); ++it) {
  string funName = "get" + *it;
  // somehow call obj.getVar1()....obj.getVarN()
}
Foo-obj;
字符串输入=“Var1,Var2,Var3,…VarN”;
向量标记=拆分字符串(输入);
for(vector::const_iterator it=tokens.begin();it!=tokens.end();+it){
string funName=“get”+*it;
//以某种方式调用obj.getVar1()…obj.getVarN()
}
使用if-else可以处理少量变量,但不适合处理大量变量。使用绑定和函子也不能解决这个问题。一个网页建议让内存在运行时可执行,然后使用reinterpret_cast,我不知道这是否可行

更新

< >从互联网上的答案和其他搜索,我看到C++中没有这样的优雅方式。目前C++中没有反射。所有的黑客都需要对成员函数指针进行编译时解析。 当你有很多变量、设置器和吸收器功能时,有人能给我一些关于备选类设计的想法吗?或者在C++中,GET和Stter是好的实践吗?

< P>你不能在运行时“添加”成员。C++在编译时是强类型的。 通过使用
映射
并使用它将字符串解析为实际函数,可以获得所需的行为。您可以使用宏来创建它,以确保字符串名称与函数名称匹配

#DEFINE ADD_METHOD(map_var, func) map_var["func"] = &func
您不能在运行时“添加”成员。C++在编译时是强类型的。 通过使用
映射
并使用它将字符串解析为实际函数,可以获得所需的行为。您可以使用宏来创建它,以确保字符串名称与函数名称匹配

#DEFINE ADD_METHOD(map_var, func) map_var["func"] = &func

一个简单/不完美的解决方案可能是使用中间方法检查参数并相应地调用getVar*方法

像这样的例子可能是:

class Foo 
{
public:
    explicit Foo() {}

    int getVar1() { return 1; }
    int getVar2() { return 2; }

    void setVar1(int v) { var1 = v; }
    void setVar2(int v) { var2 = v; }

    int callGetVar(const std::string &var)
    {
        if (var == "Var1") return getVar1();
        if (var == "Var2") return getVar2();
        else { return -1; }
    }

private:
    int var1, var2;
};

int main()
{
    Foo obj;
    std::string input = "Var1,Var2,Var3,...VarN";
    std::vector<std::string> tokens = { "Var1", "Var2", "Var2", "Var1", "Var1", "Var2", "Var2", "Var1"};
    auto tokensIT = tokens.begin();
    for (; tokensIT != tokens.end(); ++tokensIT) 
    {
        // somehow call obj.getVar1()....obj.getVarN()
        std::cout << obj.callGetVar(*tokensIT);
    }

    return 0;
}
class-Foo
{
公众:
显式Foo(){}
int getVar1(){return 1;}
int getVar2(){return 2;}
void setVar1(int v){var1=v;}
void setVar2(int v){var2=v;}
int callGetVar(const std::string&var)
{
if(var==“Var1”)返回getVar1();
if(var==“Var2”)返回getVar2();
else{return-1;}
}
私人:
int-var1,var2;
};
int main()
{
富奥比;
std::string input=“Var1,Var2,Var3,…VarN”;
向量标记={“Var1”、“Var2”、“Var2”、“Var1”、“Var1”、“Var2”、“Var2”、“Var2”、“Var1”};
auto-tokensIT=tokens.begin();
for(;tokensIT!=tokens.end();++tokensIT)
{
//以某种方式调用obj.getVar1()…obj.getVarN()

std::cout一个简单/不完美的解决方案可以是使用一个中间方法检查参数并相应地调用getVar*方法

像这样的例子可能是:

class Foo 
{
public:
    explicit Foo() {}

    int getVar1() { return 1; }
    int getVar2() { return 2; }

    void setVar1(int v) { var1 = v; }
    void setVar2(int v) { var2 = v; }

    int callGetVar(const std::string &var)
    {
        if (var == "Var1") return getVar1();
        if (var == "Var2") return getVar2();
        else { return -1; }
    }

private:
    int var1, var2;
};

int main()
{
    Foo obj;
    std::string input = "Var1,Var2,Var3,...VarN";
    std::vector<std::string> tokens = { "Var1", "Var2", "Var2", "Var1", "Var1", "Var2", "Var2", "Var1"};
    auto tokensIT = tokens.begin();
    for (; tokensIT != tokens.end(); ++tokensIT) 
    {
        // somehow call obj.getVar1()....obj.getVarN()
        std::cout << obj.callGetVar(*tokensIT);
    }

    return 0;
}
class-Foo
{
公众:
显式Foo(){}
int getVar1(){return 1;}
int getVar2(){return 2;}
void setVar1(int v){var1=v;}
void setVar2(int v){var2=v;}
int callGetVar(const std::string&var)
{
if(var==“Var1”)返回getVar1();
if(var==“Var2”)返回getVar2();
else{return-1;}
}
私人:
int-var1,var2;
};
int main()
{
富奥比;
std::string input=“Var1,Var2,Var3,…VarN”;
向量标记={“Var1”、“Var2”、“Var2”、“Var1”、“Var1”、“Var2”、“Var2”、“Var2”、“Var1”};
auto-tokensIT=tokens.begin();
for(;tokensIT!=tokens.end();++tokensIT)
{
//以某种方式调用obj.getVar1()…obj.getVarN()

STD::CUT

作为一个想法,考虑下面的代码

struct A
{
    void f1() { std::cout << "A::f1()\n"; }
    void f2() { std::cout << "A::f2()\n"; }
    void f3() { std::cout << "A::f3()\n"; }
    void f4() { std::cout << "A::f4()\n"; }
};

std::map<std::string, void( A::* )()> m = { { "f1", &A::f1 }, { "f2", &A::f2 }, { "f3", &A::f3 }, { "f4", &A::f4 } };

A a;

for ( auto p : m ) ( a.*p.second )();
结构A {
空f1({STD::CUT

)作为一个想法考虑下面的代码

struct A
{
    void f1() { std::cout << "A::f1()\n"; }
    void f2() { std::cout << "A::f2()\n"; }
    void f3() { std::cout << "A::f3()\n"; }
    void f4() { std::cout << "A::f4()\n"; }
};

std::map<std::string, void( A::* )()> m = { { "f1", &A::f1 }, { "f2", &A::f2 }, { "f3", &A::f3 }, { "f4", &A::f4 } };

A a;

for ( auto p : m ) ( a.*p.second )();
结构A {
void f1(){std::cout为什么不以引用的方式查看它: 为每个变量指定一个索引号,从0、1、2开始。。。。 将这些值保存在映射中(键是变量名,值是赋值)。 这些变量的所有值都保存在一个数组中,因此第一个变量的值在单元格0中,下一个变量的值在单元格1中,以此类推


因此,当您想要获取/设置值时,您需要做的就是在映射中找到它的索引,并访问向量中的相关单元格。

为什么不以引用的方式查看它: 为每个变量指定一个索引号,从0、1、2开始。。。。 将这些值保存在映射中(键是变量名,值是赋值)。 这些变量的所有值都保存在一个数组中,因此第一个变量的值在单元格0中,下一个变量的值在单元格1中,以此类推


当你想要获得/设置值时,你需要做的就是在地图中找到它的索引,并在向量中访问相关的单元。< /P>你不能在C++中这样做,但是你可以用一个次优的方式得到等价的功能。你可以看看我写了一个工具,它帮助你根据你的类生成反射代码:你不能在C++中这样做。但是,您可以以次优的方式获得等效的功能。您可能会看到,我编写了一个工具,帮助您根据类生成反射代码:我想在我的帖子中附加一个选项,您可以将映射作为Classic的静态数据成员。我想在我的帖子中附加一个选项,您可以将映射作为静态数据成员你们班的学生