2017-05-09 55 views
2

我的問題是:我如何通過一個類的成員函數到的for_each使用類的成員函數的for_each

我試圖去上班代碼:

(當函數類的外部定義工作)

失敗的部分被註釋掉 - 使用for_each作爲類成員函數的函數

任何有關如何使其工作的建議?

#include <iostream> 
#include <algorithm> 
#include <vector> 

void my_function(std::string str) 
{ 
std::cout << "processing settings: " << str << std::endl; 
} 

class Settings_vector{ 

public: 
std::vector <std::string> settings; 

Settings_vector(){       // push back vector of objects 
    settings.push_back("settings 1"); 
    settings.push_back("settings 2"); 
    settings.push_back("settings 3"); 
    settings.push_back("settings 4"); 
       } 

void tester(std::string settings_string){ 
    std::cout << "processing settings: " << settings_string << std::endl; 
             } 
}; 

int main() 
{ 
//std::vector<std::string> my_vector; 

Settings_vector settings_vector; 

    std:: cout << "doing things the non-class way\n" << std::endl; 
for_each(settings_vector.settings.begin(), settings_vector.settings.end(),  my_function); // testing function 
// WORKS 
/* 
    std:: cout << "doing things the modern way\n" << std::endl; 
for_each(settings_vector.settings.begin(), settings_vector.settings.end(), settings_vector.tester); // testing function 
// FAILS 
*/ 

std:: cout << "doing things the oldskool way\n" << std::endl; 
for (int i = 0;i<settings_vector.settings.size();++i) { 
settings_vector.tester(settings_vector.settings[i]); 
} 
// WORKS 


return 0; 
} 
+0

我把多一點的解釋在我的例子。如果該帖子回答你的問題,如果你能接受它,那將是非常棒的。 – ovanes

回答

6

最簡單的方法是使用lambda表達式。複雜一點的方法是使用std::bind()綁定所有已知的參數(這裏的類成員函數的實例),並將未知參數佔位符_1_2

#include <iostream> 
#include <algorithm> 
#include <vector> 

class Settings_vector 
{ 
    Settings_vector() 
    : settings { "settings 1" 
       , "settings 2" 
       , "settings 3" 
       , "settings 4" 
       } 
    {} 

    void tester(std::string settings_string) 
    { std::cout << "processing settings: " << settings_string << std::endl; } 

public: 
    std::vector <std::string> settings; 
}; 

int main() 
{ 
    Settings_vector settings_vector; 

    using namespace std; 
    using namespace std::placeholders; // for _1 

    // Possibility Nr. 1: Use a Lambda Function 
    for_each(settings_vector.settings.begin(), settings_vector.settings.end() 
      , [&settings_vector](auto input){ settings_vector.tester(input); } 
     ) 
    ; 

    // Possibility Nr. 2: Partially bind existing arguments and use placeholders for others 
    for_each(settings_vector.settings.begin(), settings_vector.settings.end() 
      , std::bind(&Settings_vector::tester, &settings_vector, _1); 
     ) 
    ; 

    return 0; 
} 

說明:

  • 我認爲拉姆達是直截了當的。在方括號中,你聲明瞭關閉的內容。我們在這裏通過settings_vector。在&之前表示此實例通過引用傳遞。在括號中,我們向函數聲明參數。我騙了一點,因爲在C++ 14中引入了lambda表達式中的auto,但您也可以將它寫爲std::string

  • std::bind()將參數綁定到函數指針並返回可調用對象。如果所有參數都存在,則返回的可調用函數沒有參數,可以這樣調用:callable()。在這裏,我們希望可調用來接受迭代的結果。因此,我們使用一個佔位符_1,它表明這個參數將在通話時改變。現在剩下兩件事:

    • 獲取指向成員函數的指針。這是通過使用&TypeName::MemberName完成的,在這種情況下爲&Settings_vector::tester

    • 傳遞this指向成員函數調用的指針:&settings_vector。當調用成員函數時,必須傳遞一個對象來調用該成員函數。因爲我們只是獲得了一個沒有任何綁定對象的成員函數指針,這就是爲什麼第二個參數是&settings_vector

相關問題