テンプレート化されたいくつかのポリシーを使用するクラスがあります。次の例で呼び出さDish
れます。Dish
これらのesの多くを (単純な基本クラスへのポインターを使用して) に格納vector
していますが、それらを抽出して使用したいと考えています。しかし、私はそれらの正確なタイプを知りません。
コードは次のとおりです。少し長いですが、とてもシンプルです。
#include <iostream>
#include <vector>
struct DishBase {
int id;
DishBase(int i) : id(i) {}
};
std::ostream& operator<<(std::ostream& out, const DishBase& d) {
out << d.id;
return out;
}
// Policy-based class:
template<class Appetizer, class Main, class Dessert>
class Dish : public DishBase {
Appetizer appetizer_;
Main main_;
Dessert dessert_;
public:
Dish(int id) : DishBase(id) {}
const Appetizer& get_appetizer() { return appetizer_; }
const Main& get_main() { return main_; }
const Dessert& get_dessert() { return dessert_; }
};
struct Storage {
typedef DishBase* value_type;
typedef std::vector<value_type> Container;
typedef Container::const_iterator const_iterator;
Container container;
Storage() {
container.push_back(new Dish<int,double,float>(0));
container.push_back(new Dish<double,int,double>(1));
container.push_back(new Dish<int,int,int>(2));
}
~Storage() {
// delete objects
}
const_iterator begin() { return container.begin(); }
const_iterator end() { return container.end(); }
};
int main() {
Storage s;
for(Storage::const_iterator it = s.begin(); it != s.end(); ++it){
std::cout << **it << std::endl;
std::cout << "Dessert: " << *it->get_dessert() << std::endl; // ??
}
return 0;
}
トリッキーな部分は、main()
関数にあります。
std::cout << "Dessert: " << *it->get_dessert() << std::endl; // ??
どうすればデザートにアクセスできますか? ストレージから取得しているオブジェクトの完全な型は言うまでもなく、デザートの型 (テンプレート化されている) もわかりません。
これは単なるおもちゃの例ですが、私のコードはこれに縮小されると思います。これらのクラスを渡したいだけDish
で、コードのさまざまな部分がさまざまな部分にアクセスします (例では、前菜、メイン ディッシュ、またはデザート)。