我做了相当多的搜索,但*()和类作用域的组合极大地阻碍了我对语法的理解,每次编辑都会抛出一个新错误,任何帮助?在矢量中存储特定类的成员函数的语法是什么?
我想要做的事:
声明一个std ::指向成员函数MyClass.h
发现的矢量分配实际的成员函数MyClass中的的std ::向量。 CPP的构造
的成员函数不是静态的
谢谢!
我做了相当多的搜索,但*()和类作用域的组合极大地阻碍了我对语法的理解,每次编辑都会抛出一个新错误,任何帮助?在矢量中存储特定类的成员函数的语法是什么?
我想要做的事:
声明一个std ::指向成员函数MyClass.h
发现的矢量分配实际的成员函数MyClass中的的std ::向量。 CPP的构造
的成员函数不是静态的
谢谢!
我很好奇你要从哪里使用它们。你看到为了调用一个C++类的成员函数,你需要有一个实例指针来调用它(每个成员函数都需要这个来访问类的状态)。所以通常情况下你会用std :: bind将成员函数指针与实例指针一起包装起来,然后将结果存储在std :: function中。为了将它们放入矢量中,它们都将需要相同的签名。
这是你要找的那种东西:从OP我会提出这个
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();
}
进一步澄清后:
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");
}
你可以使用成员函数指针像这样(在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::function
,这是类似。
做这些功能都具有相同的签名? – chris 2013-04-07 21:07:59
@克里斯 是的,现在他们都在同一个类和所有不带参数,但它们命名不同,我不知道如果名称被视为签名与否= S – Hobbyist 2013-04-07 21:09:49
的一部分不,就在类型和一些修饰符。 – chris 2013-04-07 21:14:39