2013-04-07 56 views
0

我做了相当多的搜索,但*()和类作用域的组合极大地阻碍了我对语法的理解,每次编辑都会抛出一个新错误,任何帮助?在矢量中存储特定类的成员函数的语法是什么?

我想要做的事:

声明一个std ::指向成员函数MyClass.h

发现的矢量分配实际的成员函数MyClass中的的std ::向量。 CPP的构造

的成员函数不是静态的

谢谢!

+0

做这些功能都具有相同的签名? – chris 2013-04-07 21:07:59

+0

@克里斯 是的,现在他们都在同一个类和所有不带参数,但它们命名不同,我不知道如果名称被视为签名与否= S – Hobbyist 2013-04-07 21:09:49

+0

的一部分不,就在类型和一些修饰符。 – chris 2013-04-07 21:14:39

回答

2

我很好奇你要从哪里使用它们。你看到为了调用一个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"); 
} 
+0

我不会提到'std :: bind',但是你解释得很好:) – chris 2013-04-07 21:30:58

+0

@Peter R 我想比较一个方法中的字符串向量,然后在' MyClass.ccp',有没有更好的方法来做到这一点? – Hobbyist 2013-04-07 21:32:25

+0

@爱好者,如果你的意思是像反射一样,除了一些反射库外,函数的字符串映射可能是最容易做到的,即使如此,也很难包含不同的签名。说到这一点,这正是Peter在他的回答中所做的一切:) – chris 2013-04-07 21:39:17

2

你可以使用成员函数指针像这样(在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,这是类似。

+0

我想我可能已经错误地使用了术语=方法和功能是一样的吗?例如; 'void MyClass :: myMethod(){};'MyClass.ccp'' – Hobbyist 2013-04-07 21:26:56

+0

@爱好者,是的。它们倾向于在C++中被称为函数。这特别是一个成员函数。像Java这样的东西不需要“成员函数”,因为每个函数都必须在Java类中,所以Java中的所有成员函数通常被称为方法。 – chris 2013-04-07 21:27:46

相关问题