Я пытаюсь найти обходное решение для использования вариативных шаблонов в C++ 03.C++ 03: Шаблоны Variadic с использованием boost
То, что я хотел бы достичь, - в шаблоном классе - был создан атрибут boost::tuple
, который будет состоять из вектора для каждого параметра шаблона отдельного класса.
Вот как это будет выглядеть, как с помощью C++ 11 VARIADIC шаблоны:
template<typename ...Parameters>
class Foo
{
typedef std::tuple<std::vector<Parameters>...> Vectors_t;
Vectors_t _vectorsTuple;
}
Я хотел бы добиться того же с помощью наддува :: кортеж и повышение :: MPL или независимо от других возможных способов.
Благодаря
UPDATE
Это окончательное решение, которое я придумал. Частично основано на предложении @stefanmoosbrugger.
template<class TypesList>
class FooImpl
{
typedef TypesList TypesList_t;
typedef typename boost::mpl::transform <
TypesList_t,
std::vector<boost::mpl::_1>
>::type VectorTypesList_t;
typedef typename boost::mpl::reverse_fold<
VectorTypesList_t,
boost::tuples::null_type,
boost::tuples::cons<boost::mpl::_2, boost::mpl::_1>
>::type VectorsTuple_t;
protected:
VectorsTuple_t _vectorsTuple;
};
template<class Type1,
class Type2 = boost::mpl::na,
class Type3 = boost::mpl::na,
class Type4 = boost::mpl::na> /* Made it up to four possible types as an example */
class Foo : public FooImpl<boost::mpl::vector<Type1, Type2, Type3, Type4> >{};
Спасибо, что не так уж плохо :) Любые возможности преобразования из MPL :: вектора текущего кортежа может быть менее уродливой? Нам действительно нужны макросы BOOST_PP_ENUM и пользовательский push_front? Удивительно, если бы это было достигнуто более плавным способом, используя mpl :: transform, а не fold – codeJack
ну, вы могли бы использовать 'mpl :: transform' на' mpl_vec_t' для преобразования элементов из 'Tx' в' std :: vector ', а затем просто создайте из него вектор слияния (' boost :: fusion :: result_of :: as_vector :: type') .. :) определенно выглядят менее уродливыми. –
Не могли бы вы обновить свой код этим решением? :) – codeJack