2009-06-22 24 views
11

(. Bellek sızıntıları ile ilgili bir şey işaret etmeyin, yıkıcı sanal vs değil bu sadece bir test programı) Böyle bir hiyerarşi var Sağlar ki:std :: mem_fun kullanırken iki parametre nasıl iletilir?

class I 
{ 
public: 
    virtual void fun(int n, int n1) = 0; 
}; 

class A : public I 
{ 
public: 
    void fun(int n, int n1) 
    { 
     std::cout<<"A::fun():" <<n<<" and n1:" <<n1<<"\n"; 
    } 
}; 

class B : public I 
{ 
public: 
    void fun(int n, int n1) 
    { 
     std::cout<<"B::fun():" <<n<<" and n1:" <<n1<<"\n"; 
    } 
}; 


int main() 
{ 
    std::vector<I*> a; 
    a.push_back(new A); 
    a.push_back(new B); 

    //I want to use std::for_each to call function fun with two arguments. 
} 

Eğlenceyi() yöntemi çağırmak nasıl ki std :: for_each kullanarak iki argüman alır Ben std :: mem_fun muhtemelen std :: bind2nd ile kullanmam gerektiğini düşünüyorum, ancak bunu nasıl yapacağımı anlayamıyorum. Bunu nasıl başaracağınıza dair bir ipucu var mı? Ben destek kullanmıyorum.

+1

Yükseltme kullanmıyorsunuz tr1iniz yok mu? –

cevap

7

Böyle kendi functor oluşturabilirsiniz:

class Apply 
{ 
private: 
    int arg1, arg2; 

public: 
    Apply(int n, int n1) 
    : arg1(n), arg2(n1) 
    {}   

    void operator() (I* pI) const 
    { 
    pI->fun(arg1, arg2); 
    } 
}; 

int main() 
{ 
    // ... 
    std::for_each(a.begin(), a.end(), Apply(n, n1)); 
} 

veya kullanım boost :: bağlama böyle:

std::for_each(
    a.begin(), 
    a.end(), 
    boost::bind(&I::fun, _1, n, n1)); 
+0

Bir functor yazmaktan kaçınabileceğimi umuyordum ... hiçbir çıkış yolu yok gibi görünüyor. Öyle değil mi? – Naveen

+0

Bir std :: mem_fun en çok bir bağımsız değişkeni kabul ettiğinden beri sadece stl kullanmanın bir yolu olup olmadığını bilmiyorum. – Tobias

4

Bunu std ciltleyicileriyle yapamazsınız. Elbette kendi bisikletçinizi yazabilirsiniz.

struct TwoArguments 
{ 
    int one; 
    int two; 

    TwoArguments(int one, int two) : one(one),two(two){ 
    } 

    void operator()(I* i) const { 
     i->fun(one, two); 
    } 
}; 
1

şablonları kullanmak olacaktır Bunu yapmanın bir başka yolu. (O olsa kötü bir uygulama olup olmadığını söyle!) Bunu yaptığınız her kombinasyon için kod oluşturmak olacağından farklı parametreler bir sürü diyoruz düşünmüyorsanız eğer iyi olurdu

template<int N, int N1> 
void Apply(I* i) 
{ 
    i->fun(N, N1); 
} 

std::for_each(a.begin(), a.end(), Apply<firstParam, secondParam>); 

.

+1

bu ilginç .. Bunu hiç böyle uygulamayı düşünmedim. – Naveen

+4

Ancak bu çözüm sadece N, N1 parametreleri derleme zamanında biliniyorsa çalışır. std :: for_each (a.begin(), a.end(), Apply ) yazamazsınız; – Tobias

+0

Siz efendim –

İlgili konular