我想要类似的东西
template <typename... Ts>
using make_variant_t = /* ??? */;
例如,make_variant_t<Foo, Bar>
评估为类型
std::variant<Foo, std::vector<Foo>, Bar, std::vector<Bar>>
按此顺序。可能的话,如何实现?
答案 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