Как преобразовать типы boost :: fusion :: vector?

Raider спросил: 12 мая 2018 в 05:09 в: c++

Мне нужно определить два типа для указанного списка типов: сначала это boost::fusion::vector этих типов, а второй - boost::fusion::vector, где ссылки и const удаляются для каждого типа в списке типов.

Например, у меня есть int, unsigned & и long const &. Мне нужно определить boost::fusion::vector<int, unsigned &, long const &> и boost::fusion::vector<int, unsigned, long>.

Вот мой код:

struct RemoveRef
{
    template <class T>
    struct apply
    {
        using type =
            typename std::remove_const<typename std::remove_reference<T>::type>::type;
    };
};template <typename...Args>
struct BasicDefinition
{
    typedef typename boost::mpl::vector<Args...> Types;
    typedef typename boost::fusion::result_of::as_vector<Types>::type ArgsType;
    typedef typename boost::mpl::transform<Types, RemoveRef>::type ValueTypes;
    typedef typename boost::fusion::result_of::as_vector<ValueTypes>::type ArgValuesType;
};

Он работает. Я получаю эти типы как BasicDefinition<>::ArgsType и BasicDefinition<>::ArgValuesType. Но я хочу избавиться от boost::mpl::vector s и создать второй тип непосредственно из первого. Возможно ли достичь такого результата?

Что-то вроде:

template <typename...Args>
struct BasicDefinition
{
    typedef typename boost::fusion::vector<Args...> ArgsType;
    typedef ?????<ArgsTypes, RemoveRef>::type ArgValuesType;
};

1 ответ

Есть решение
Jarod42 ответил: 12 мая 2018 в 05:30

Вы можете использовать std::decay_t

template <typename...Args>
struct BasicDefinition
{
    using ArgsType = boost::fusion::vector<Args...>;
    using ArgValuesType = boost::fusion::vector<std::decay_t<Args>...>;
};
Raider ответил: 13 мая 2018 в 04:55
Большое спасибо! Он работает точно так, как я хочу!