我做了很多搜索,但是 * () 和类范围的组合极大地阻碍了我对语法的理解,每次编辑都会抛出一个新错误,有帮助吗?
我正在尝试做的事情:
声明指向 MyClass.h 中的成员函数的指针的 std::vector
将实际的成员函数分配给 MyClass.cpp 的构造函数中的 std::vector
成员函数不是静态的
谢谢!
我做了很多搜索,但是 * () 和类范围的组合极大地阻碍了我对语法的理解,每次编辑都会抛出一个新错误,有帮助吗?
我正在尝试做的事情:
声明指向 MyClass.h 中的成员函数的指针的 std::vector
将实际的成员函数分配给 MyClass.cpp 的构造函数中的 std::vector
成员函数不是静态的
谢谢!
您可以像这样使用成员函数指针(C++11 与该部分无关):
struct S {
int foo(){std::cout<<"foo"; return 0;}
int bar(){std::cout<<"bar"; return 0;}
};
int main() {
std::vector<int(S::*)()> funcs{&S::foo, &S::bar};
S s;
for (auto func : funcs) {
(s.*func)();
}
}
但是,如果你使用 C++11,std::function
可以让它更干净一点:
std::vector<std::function<int(S &)>> funcs{&S::foo, &S::bar};
S s;
for (auto func : funcs) {
func(s);
}
如果你使用 C++03,Boost 有boost::function
,这也是类似的。
我很好奇你打算从哪里使用它们。您会看到,为了调用 C++ 类成员函数,您需要一个实例指针来调用它(每个成员函数都需要一个 this 才能访问类状态)。所以通常你会用 std::bind 将成员函数指针与实例指针一起包装,然后可能将结果存储在 std::function 中。要将它们放入向量中,它们都需要相同的签名。
这是你要找的东西吗:
class P
{
typedef std::function<void (void)> func_t;
std::vector<func_t> functions;
public:
P()
{
functions.push_back(std::bind(&P::foo1, this));
functions.push_back(std::bind(&P::foo2, this));
functions.push_back(std::bind(&P::foo3, this));
}
void foo1(void)
{
std::cout << "foo1\n";
}
void foo2(void)
{
std::cout << "foo2\n";
}
void foo3(void)
{
std::cout << "foo3\n";
}
void call()
{
for(auto it = functions.begin(); it != functions.end(); ++it)
{
(*it)();
}
}
};
int main()
{
P p;
p.call();
}
在OP进一步澄清后,我将提出以下建议:
class P
{
typedef std::function<void (void)> func_t;
std::map<const char*, func_t> functions;
public:
P()
{
functions["foo1"] = std::bind(&P::foo1, this);
functions["foo2"] = std::bind(&P::foo2, this);
functions["foo3"] = std::bind(&P::foo3, this);
}
void foo1(void)
{
std::cout << "foo1\n";
}
void foo2(void)
{
std::cout << "foo2\n";
}
void foo3(void)
{
std::cout << "foo3\n";
}
void call_by_name(const char* func_name)
{
functions[func_name]();
}
};
int main()
{
P p;
p.call_by_name("foo1");
p.call_by_name("foo2");
p.call_by_name("foo3");
}