gpt4 book ai didi

c++ - 在类模板中创建映射元组

转载 作者:搜寻专家 更新时间:2023-10-31 00:39:18 27 4
gpt4 key购买 nike

struct VectorOfMaps {
std::tuple<std::map<std::string,double>,
std::map<std::string,int>,
std::map<std::string,short>
> tuple;
};

我想将它概括为一个模板,所以上面的类将由类似的东西生成

VectorOfMaps<3, std::string,double,
std::string,int,
std::string,short>

可以这样做或类似的事情吗?

我知道我可以将 map 类型直接放入模板中,但是这样重复“std::map”会不会有点难看?你怎么看?

(我想过我是否可以在模板中指定 std::pair 类型,但我不确定是否可以直接使用它们来创建 std::map 类型)..

最佳答案

由于您提到将对的特化传递给类模板:

template<typename... Pairs>
struct VectorOfMaps {
std::tuple<std::map<
typename Pairs::first_type
, typename Pairs::second_type
>...> tuple;
};

这有效地使用了 std::pair作为类型列表——你可以使用类似 template<typename T, typename U> struct pair { using first_type = T; using second_type = U; }; 的东西也一样。

也可以在没有一对的情况下传递类型,但这需要一些元计算。一个可能的解决方案:

// First argument is accumulator, supposed to be an empty tuple
template<typename Acc, typename... T> struct compute_tuple
{
// Only triggered when the primary template is instantiated, which should
// only happen if sizeof...(T) is odd -- it's possible to assert on that
// instead, too.
static_assert( !sizeof(Acc), "An even number of arguments is required" );
};

// Recursive case
template<typename... Acc, typename First, typename Second, typename... Rest>
struct compute_tuple<std::tuple<Acc...>, First, Second, Rest...>
: compute_tuple<std::tuple<Acc..., std::map<First, Second>>, Rest...> {};

// Terminal case
template<typename Acc>
struct compute_tuple<Acc> { using type = Acc; };

template<typename... T>
struct VectorOfMaps {
/*
* You can assert that sizeof...(T) is even here; it might be more
* helpful than an error deeper inside compute_tuple.
*/
using tuple_type = typename compute_tuple<std::tuple<>, T...>::type;
tuple_type tuple;
};

关于c++ - 在类模板中创建映射元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16379860/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com