2013-04-07 62 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

相關問題