使用 hana::transform 在 C++14 中转换元组内的类型
Use hana::transform to transform types inside tuple in C++14
>我正在尝试使用 Boost 的hana::transform
来更改hana::tuple
中的类型。举个例子,假设我有
constexpr auto some_tuple = hana::tuple_t<int, char *, bool>;
我想生产
constexpr auto transformed_tuple = hana::tuple_t<std::vector<int>,
std::vector<char *>,
std::vector<bool>>;
尝试 1
解决方案对我来说似乎很容易:使用hana::transform
并使应用的函数返回hana::type_c<std::vector<decltype(T)::type>>
。但是,我无法完成这项工作:
constexpr auto transformed_tuple = hana::transform(some_tuple, [](auto T) {
using inner_type = typename decltype(T)::type;
return hana::type_c<std::vector<inner_type>>;
});
这有一个问题,lambda 表达式不是constexpr
- 我想留在 C++14,即 lambda 不能constexpr
。
尝试 2
我的下一个想法:如果我把hana::transform
包成一个decltype
,然后在上面使用hana::type_c
呢?这样,就永远不需要计算 lambda(只需推导其返回类型),并且constexpr
ness 应该无关紧要:
constexpr auto transformed_tuple =
hana::type_c<decltype(hana::transform(some_tuple, [](auto T) {
using inner_type = typename decltype(T)::type;
return hana::type_c<std::vector<inner_type>>;
}))>;
但是,现在我遇到了一个问题,即 lambda 表达式可能不会出现在"未计算的上下文"中。
我的方法完全错误吗?我应该使用hana::transform
以外的其他东西吗?
感谢您的任何帮助。
编辑:
示例代码:
#include <boost/hana.hpp>
#include <boost/hana/tuple.hpp>
#include <boost/hana/type.hpp>
namespace hana = boost::hana;
#include <vector>
constexpr auto some_tuple = hana::tuple_t<int, char *, bool>;
/** What I want:
*
* constexpr auto transformed_tuple
* = hana::tuple_t<std::vector<int>,
* std::vector<char *>,
* std::vector<bool>>;
**/
#if ATTEMPT1
constexpr auto transformed_tuple = hana::transform(some_tuple, [](auto T) {
using inner_type = typename decltype(T)::type;
return hana::type_c<std::vector<inner_type>>;
});
#elif ATTEMPT2
constexpr auto transformed_tuple = hana::type_c<decltype(hana::transform(some_tuple, [](auto T) {
using inner_type = typename decltype(T)::type;
return hana::type_c<std::vector<inner_type>>;
}))>;
#endif
Boost.Hana具有将类型应用于返回类型的模板的hana::template_
。
#include <boost/hana/assert.hpp>
#include <boost/hana/equal.hpp>
#include <boost/hana/transform.hpp>
#include <boost/hana/tuple.hpp>
#include <boost/hana/type.hpp>
#include <vector>
namespace hana = boost::hana;
int main() {
constexpr auto some_tuple = hana::tuple_t<int, char *, bool>;
constexpr auto expected_tuple = hana::tuple_t<std::vector<int>,
std::vector<char*>,
std::vector<bool>>;
constexpr auto transformed_tuple = hana::transform(some_tuple, hana::template_<std::vector>);
BOOST_HANA_CONSTANT_CHECK(transformed_tuple == expected_tuple);
}
相关文章:
- 将元组的向量转换/构造为堆
- 如何在编译时将齐次元组转换为数组?
- Boost.Hana:在 constexpr 上下文中将值元组转换为相应类型的元组
- 将多个数组转换为元组
- 将函数应用于元组中的每个元素,将每个元素强制转换为类型包中的不同类型,然后作为参数包传递
- 为什么此元组到引用元组 (std::tie) 转换有效?
- 将树转换为元组的编译时转换
- 如何将标准::数组转换为标准::元组?
- 如何将元组转换为C 11中的字节数组
- 元组尺寸默认构造函数及其转换为std :: size_t
- 使用 hana::transform 在 C++14 中转换元组内的类型
- 将STD ::变体转换为STD ::模板类实例的元组
- 将 integral_constants 元组转换为整数元组
- 错误:无法从"元组<[...]、std::__1::元组<无符号长长、无符号长长>>"到"常量元组<[...],uint_type>"的可行转换
- 将元组转换为变体
- Boost::P ython,将元组转换为Python有效,矢量<tuple>不
- 有没有一种方法可以将左值和右值的列表分别转换为具有引用类型和完整类型的元组
- 将元组转换为函数参数
- 如何使用笛卡尔积将向量元组转换为元组的向量
- 将std::元组转换为模板参数包