Boost MPL предоставляет для этого конструкцию времени компиляции, например:
typedef boost::mpl::vector<int, double, std::string, CustomA, CustomB> seq_of_types;
Вы можете взаимодействовать с этим при компиляции, используя обширный набор метафункций, определенных в mpl. Есть также некоторые функции кроссовера во время выполнения. Важным моментом здесь является то, что это последовательность типов, нет экземпляров каждого типа, с которыми нужно взаимодействовать. Даже функции времени выполнения позволяют взаимодействовать только с типами.
Boost Fusion (и std::tuple
) вмешивается здесь, чтобы предоставить гетерогенный контейнер во время выполнения, например
boost::fusion::vector<int, double, std::string> v{10, 100., "Foo"};
Теперь во время компиляции у вас есть доступ к информации о типе каждой записи, а во время выполнения у вас есть экземпляр каждого типа в последовательности для работы.
Вполне возможно, что то, чего вы пытаетесь достичь, может быть выполнено с помощью простого наследования без необходимости прибегать к вышеизложенному, поэтому вектор содержит указатель на базовый класс, который имеет виртуальную функцию, которая переопределяется в производных классах, которые делают то, что ты хочешь. Это, пожалуй, самое чистое.
В качестве альтернативы то же самое возможно, не прибегая к использованию наследования, если вы используете вариативный тип, такой как boost::variant
, например:
std::vector<boost::variant<int, double, std::string>> entries;
Теперь каждая запись является одним из типов int
, double
, std::string
. Затем по мере повторения вы можете использовать статического посетителя для работы с конкретным экземпляром. Я думаю, что некоторое время назад я ответил на вопрос о SO, который демонстрирует это.
Так что же это будет?
РЕДАКТИРОВАТЬ: основываясь на вашем последнем комментарии, последний (вариант) на самом деле не летает, как и простое наследование. Я думаю, что вектор слияния действительно не нужен, так как вам не нужен экземпляр каждого типа. Тогда наиболее подходящим для вас является mpl::vector
и используйте функцию времени выполнения mpl::for_each
person
Nim
schedule
23.10.2013
class SomeClass; typedef SomeClass X; std::vector<X> v;
без проблем. - person rwols   schedule 23.10.2013using my_types = std::tuple<T1, T2, T3>
. Затем вы можете проиндексировать его с помощьюstd::tuple_element
. - person zch   schedule 23.10.2013std::vector
является мономорфным, т. е. может содержать объекты только одного статического типа. Может быть, вам стоит заглянуть в Boost.Variant? - person Xeo   schedule 23.10.2013std::tuple
илиboost::fusion::vector
. - person Nim   schedule 23.10.2013static_cast
, возможно, это возможно. В нынешнем виде не совсем понятно, что вам нужно.. - person Nim   schedule 23.10.2013