创建变体交替值和值数组

时间:2019-11-18 17:09:44

标签: c++ c++17 variadic-templates

我想要类似的东西

template <typename... Ts>
using make_variant_t = /* ??? */;

例如,make_variant_t<Foo, Bar>评估为类型

 std::variant<Foo, std::vector<Foo>, Bar, std::vector<Bar>>

按此顺序。可能的话,如何实现?

3 个答案:

答案 0 :(得分:5)

您在这里:

namespace impl
{
    template <typename R, typename ...P>
    struct make_variant {};

    template <typename ...R, typename P0, typename ...P>
    struct make_variant<std::variant<R...>, P0, P...>
    {
        using type = typename make_variant<std::variant<R..., P0, std::vector<P0>>, P...>::type;
    };

    template <typename ...R>
    struct make_variant<std::variant<R...>>
    {
        using type = std::variant<R...>;
    };
}

template <typename ...P>
using make_variant_t = typename impl::make_variant<std::variant<>, P...>::type;

现在,make_variant_t<Foo, Bar>应该扩展为std::variant<Foo, std::vector<Foo>, Bar, std::vector<Bar>>

答案 1 :(得分:5)

使用Boost.Mp11,这是一条短而单一的衬里(一如既往):

template <typename... Ts>
using make_variant_t = mp_append<variant<Ts, vector<Ts>>...>;

make_variant_t<int, char>首先将产生两个变体variant<int, vector<int>>variant<char, vector<char>>。从Mp11的意义上讲,每个都是“列表”,mp_append接收一堆列表并将它们连接在一起,根据需要生成variant<int, vector<int>, char, vector<char>>Demo

答案 2 :(得分:3)

带有cat run_command_list.txt | xargs -n 1 -P 2的替代解决方案:

std::tuple