タイプ Wrapper< T> の異種オブジェクトを格納できる汎用コンテナーを作成しようとしています。ここで、T は任意のユーザー定義型にすることができます。boost::any およびその他のソリューションを見てきましたが、再キャストせずに関数 foo() を呼び出すことはできません (再キャストするタイプがわからない、T に関する情報が失われます)。元のタイプに戻します。
これを達成するためにジェネリックコンテナを合理的に実装する/既存のジェネリックコンテナを使用するにはどうすればよいですか?
template <typename T>
class Wrapper{
public:
Wrapper(const T& a):o(a){};
Wrapper(){};
//public methods
void foo(){
//do stuff
};
private:
T o;
};
class X{};
class Y{};
int main(){
X x;
Y y;
A_GENERIC_CONTAINER generic_container;
// A_GENERIC_CONTAINER should be able to store
// any number of heterogeneous objects of type Wrapper<T>
// where T can be any user defined type.
generic_container.push_back(x);
generic_container.push_back(y);
auto it = generic_container.begin();
auto end = generic_container.end();
while(it != end){
it->foo();
++it;
}
}