我想提出以下設計模式來討論。它在基類中實現了一個通用的「getMany」方法,該方法使用派生類中的給定get方法獲取許多實體(這裏用於簡化顯式類型int)。這意味着任何派生類都必須通知「getMany」方法使用哪個get-method。這是在基類的派生類中調用指向成員函數的一個例子。C++通過基類派生類中的指針成員函數調用
我想提出的討論:什麼替代方案,更容易實現相同的模式可以想到?
謝謝!
PS:如上所述,在真實情況下,人們當然會將固定類型「int」抽象爲模板類型T.PPS:預定義get-methods作爲基類中的虛擬方法似乎不是一個好東西選項,因爲它會限制get-methods的數量和命名。
#include <iostream>
#include <memory>
#include <algorithm>
#include <vector>
using namespace std;
// EXAMPLE FOR CALL VIA POINTER TO OVERLOADED METHOD IN DERIVED CLASS FROM BASE CLASS
class FooBase
{
public:
template<class PCLASS>
std::vector<int> getMany(int (PCLASS::*getEnt)(int) const, int n, const PCLASS *pClass) const
{
std::vector<int> e;
int i = 0;
e.resize(n);
for (std::vector<int>::iterator it = e.begin(); it!=e.end(); ++it) {
*it = (pClass->*getEnt)(i++);
}
return e;
};
};
class Foo : public FooBase
{
public:
int Moo(int a) const
{
return a;
};
int Moo(char a) const
{
return (int)a;
};
std::vector<int> Moos(int n) const
{
int (Foo::*f)(int)const;
f = &Foo::Moo;
return getMany<Foo>(f, n, this);
};
};
int main(int argc, char **args)
{
Foo* myFoo = new Foo();
std::vector<int> res = myFoo->Moos(10);
for (std::vector<int>::iterator it = res.begin(); it!=res.end(); ++it) {
std::cout << *it;
}
return 1;
}
在C++ 11中? std :: function和lambdas。否則好的舊功能對象。 –
謝謝,能否詳細說一下?你如何將成員函數「Moo」傳遞給基類方法「getMany」? –
我會這樣做的答案。 –