使用 hana::transform 在 C++14 中转换元组内的类型

Use hana::transform to transform types inside tuple in C++14

本文关键字:元组 转换 类型 C++14 hana transform 使用      更新时间:2023-10-16

>我正在尝试使用 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(只需推导其返回类型),并且constexprness 应该无关紧要:

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);
}