c++ - 调用C++方法指针

原文 标签 c++ pointers c++11

我有以下示例C ++程序,它删除了指向类中方法的指针。调用该方法时出现编译器错误。

10     class Foo
11     {
12         void set_parm1(string) {}
13         void set_parm2(string) {}
14
15         typedef void (Foo::*set_func_t)(string);
16         struct Bar
17         {
18             string value;
19             set_func_t set_func;
20         };
21
22         map<string, Bar> parameter;
23
24         public:
25         Foo();
26         void set_value(string key, string value);
27     };
28
29     Foo::Foo()
30     {
31         Bar  temp;
32
33         temp.value = "value1";
34         temp.set_func = &Foo::set_parm1;
35         parameter["param1"] = temp;
36
37         temp.value = "value2";
38         temp.set_func = &Foo::set_parm2;
39         parameter["param1"] = temp;
40     }
41
42     void
43     Foo::set_value(string key, string value)
44     {
45         Bar temp;
46
47         temp = parameter[key];
48         this->*temp.set_func(value);
49     }


问题:


第48行的编译器错误


  ./test.cc:在成员函数'void Foo::set_value(std::string, std::string)'中:
  ./test.cc:51:35:错误:必须使用'.*''->*'调用'temp.Foo::Bar::set_func (...)'中的成员指针函数,例如'(... ->* temp.Foo::Bar::set_func) (...)'

我希望set_func()(指向set_parm1()set_parm2())更新地图本身中parmX的值。我是否可以获取存储在map参数中的Bar.value(第33行)的地址,以便将其传递给set_func()

如果否,那么我的下一个选择是,在地图中存储指向“ Bar”的指针,而不是复制Bar。基本上使用map<string, Bar *>
只是坚持使用STL(不使用Boost库),有一些指南可以将ptr保存到结构/类中,而不是将整个对象存储在map中。 (当然,这是假定struct / class本身没有指针,也就是存储整个对象时也不需要深层副本)。


谢谢,
艾哈迈德。

最佳答案

对于1:您需要将其放在方括号中:

(this->*temp.set_func)(value);


对于2:您可以采用temp.value的地址(您可能用Bar.value?来表示),但这将是无用的,因为它是一个临时变量,因此在Foo的ctor完成后该地址无效。

对于3:我不太确定您的意思。您可以使用std::shared_ptr等。等如果您想避免复制大型/昂贵的对象或其他类似移动语义的方法以减少开销,但是恐怕没有通用的答案。

相关文章:

c++ - 使用节点实现重新填充堆栈

c++ - 如果在类声明中未定义函数,则会导致性能损失

c++ - 模板类中的静态成员初始化

pointers - 将 map 的值指针添加到 slice 的行为

c++ - 在最后一个元素迭代器C++上停止

python - 从Cython传递闭包到C++

c++ - 返回指针的方法,该指针指向在另一个 header 中声明的数组对象,

c++ - 正确删除3D矩阵的指针

c++ - 错误C2678:二进制'+':未找到采用'volatile A'类型的左操作数的运算符(或者没有可接受的转换)

c++ - std::bind和rvalue引用