2015-03-08 52 views
1

我想要調用向量中的每個對象的成員函數,使用指定的參數,並且我希望調用是多態的。我相信下面顯示的函數vstuff實現了這一點。但是可以修改vstuff以創建一個向量< shared_ptr < Base>>不使用boost :: bind?我必須使用boost :: bind來創建多態「變換」功能嗎?

class Base{ 
      virtual double stuff(double t); 
      } 
//and some derived classes overriding stuff 
//then in some code 
vector<double> vstuff(double t, vector<Base*> things) 
{ 
vector<double> vals; 
vals.resize(things.size()); 
transform(things.begin(), things.end(), vals.begin(), std::bind2nd(std::mem_fun(&Base::stuff),t)); 
return vals; 
} 

我知道shared_ptr的小號需要的mem_fn代替mem_fun,但我還沒有成功地使的mem_fn工作與bind2nd我需要在參數t通過,所以我不知道它是否是可行的.. ?

+0

爲什麼不使用lambda表達式? – Lol4t0 2015-03-08 22:14:30

+0

我想了解如何以最小的提升使用率來實現此目的,而且該項目不是C++ 11。 – imateapot 2015-03-08 22:36:07

+2

爲什麼你想要使用std :: transform而不是一個簡單的循環? – MikeMB 2015-03-08 23:09:01

回答

0

您可以使用std::bind太(或lambda表達式):

Live On Coliru

#include <algorithm> 
#include <vector> 
#include <memory> 

struct Base { 
    virtual double stuff(double) { return 0; } 
}; 

struct Threes : Base { 
    virtual double stuff(double) { return 3; } 
}; 

struct Sevens : Base { 
    virtual double stuff(double) { return 7; } 
}; 

std::vector<double> vstuff(double t, std::vector<std::shared_ptr<Base> > things) 
{ 
    std::vector<double> vals; 
    vals.resize(things.size()); 
    transform(things.begin(), things.end(), vals.begin(), std::bind(&Base::stuff, std::placeholders::_1, t)); 
    return vals; 
} 

#include <iostream> 

int main() { 
    for (double v : vstuff(42, { 
       std::make_shared<Sevens>(), 
       std::make_shared<Sevens>(), 
       std::make_shared<Sevens>(), 
       std::make_shared<Threes>(), 
       std::make_shared<Sevens>(), 
       std::make_shared<Threes>(), 
       std::make_shared<Sevens>(), 
       std::make_shared<Sevens>(), 
       std::make_shared<Threes>(), 
       std::make_shared<Sevens>(), 
      })) 
    { 
     std::cout << v << " "; 
    } 
} 

打印

7 7 7 3 7 3 7 7 3 7 
+0

謝謝sehe我會接受這個答案。 – imateapot 2015-03-09 11:28:50

相關問題