从 C++11 中的容器元组中提取value_type元组
Extracting a tuple of value_type from a tuple of containers in C++11
我有一个带有模板参数的函数,我知道它是几个不同元素类型的标准C++容器的std::tuple
。如何从中提取元素类型的std::tuple
类型?
例如,假设我有以下函数
template <typename TupOfCtrs>
void doStuff(const TupOfCtrs& tupOfCtrs) {
using TupOfElements = /*extract a tuple type by applying CtrT::value_type to each container in tupOfCtrs and combining the results into an std::tuple*/;
MyHelperClass<TupOfElements> helper;
}
我知道它是这样称呼的:
std::list<Foo> l {/*...*/};
std::vector<Bar> v {/*...*/};
std::deque<Baz> d {/*...*/};
auto tup = std::make_tuple(l, v, d);
在这种情况下,我希望将TupOfElements
帮助程序类型定义为 std::tuple<Foo, Bar, Baz>
。请注意,我不需要实际创建元组,只需获取其类型即可。
如何使用 Boost::Fusion 库来实现这一点?
即使没有像这样使用 Boost Fusion 也可以以更简单的方式执行此操作:
// Template which takes one type argument:
template <typename Tuple> struct TupOfValueTypes;
// Only provide a definition for this template for std::tuple arguments:
// (i.e. the domain of this template metafunction is any std::tuple)
template <typename ... Ts>
struct TupOfValueTypes<std::tuple<Ts...> > {
// This definition is only valid, if all types in the tuple have a
// value_type type member, i.e. the metafunction returns a type only
// if all types of the members in the std::tuple have a value_type
// type member, and a std::tuple can be constructed from these:
using type = std::tuple<typename Ts::value_type...>;
};
template <typename TupOfCtrs>
void doStuff(const TupOfCtrs& tupOfCtrs) {
using TupOfElements = typename TupOfValueTypes<TupOfCtrs>::type;
// ...
}
但是,明确指定std::tuple
的doStuff
当然更容易:
template <typename ... Ts>
void doStuff(const std::tuple<Ts...> & tupOfCtrs) {
using TupOfElements = std::tuple<typename Ts::value_type...>;
// ...
}
PS:另请注意,在许多情况下,如果您只需要一个类型列表,那么std::tuple
类是矫枉过正的,并且可能会稍微损害编译时间。就个人而言,我总是使用一个简单的TypeList
结构:
template <typename ... Ts> struct TypeList
{ using type = TypeList<Ts...>; };
如果你想
让doStuff
std::tuple
,明确这一点:
template <class... Ts>
void doStuff(std::tuple<Ts...> const& tupOfCtr) { ... }
一旦你有了那个参数包,只需拉出value_type
template <class... Ts>
void doStuff(std::tuple<Ts...> const& tupOfCtr)
{
using value_tuple = std::tuple<typename Ts::value_type...>;
// ...
}
相关文章:
- C++:TypeDef使用元组
- Pybind11:将元组列表从Python传递到C++
- 重载元组索引运算符-C++
- 在C++中,如何通过几种类型从元组中选择多个元素
- 将fold表达式与std::一起用于两个元组
- std::ranges::elements_view,用于自定义类似元组的数据
- 将元组的向量转换/构造为堆
- 专用于 std 元组的模板,而无需用户执行remove_cvref
- 将元组的向量构造成堆
- 元组由 Swig 生成的 Python 包装器返回,用于C++向量
- 将元组类型扩展为可变参数模板?
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 类内部和外部静态 constexpr 元组之间的差异
- 使用标准库在 c++11 中使用 std::tie 提取嵌套在元组中的元组
- 从元组中提取向量
- 如何在新元组中提取元组的子集
- 从 C++11 中的容器元组中提取value_type元组
- 按类型和歧义提取元组的元素
- 此代码如何从元组中提取参数
- GDB:我们如何从std::元组中提取值