创建具有不可移动/不可复制类型的hana元组
Create hana tuple with unmovable / noncopyable types
我正在努力理解boost::hana,并试图弄清楚如何翻译一些老式的元组代码。
也许这有点特殊,但我有既不可复制也不可移动的类型,并希望将它们打包在一个容器中。思考政策设计…
我想我只是不知道如何在价值世界中创建一个hana元组。我尝试的方式不起作用,因为make<Tuple>(CompT{}...)
需要可复制或至少可移动的类型。
所以很可能这不是正确的方法。或者这是hana的局限性?
谢谢!
struct NonMoveable
{
NonMoveable() = default;
NonMoveable(const NonMoveable& other) = delete;
int val;
};
struct Simple { int val; };
template <typename ...CompT>
struct OldSchoolContainer
{
template <int I>
auto& getComponent()
{
return std::get<I>(components);
}
std::tuple<CompT...> components;
};
template <typename ...CompT>
struct HanaContainer
{
using Args_t = decltype(make<Tuple>(CompT{}...));
template <int I>
auto& getComponent()
{
return components[int_<I>];
}
Args_t components;
};
int main()
{
OldSchoolContainer<Simple> simpleOsc;
static_assert(std::is_same<Simple&, decltype(simpleOsc.getComponent<0>())>::value, "");
HanaContainer<Simple> simpleHanaC;
static_assert(std::is_same<Simple&, decltype(simpleHanaC.getComponent<0>())>::value, "");
OldSchoolContainer<NonMoveable> nonmoveableOsc;
static_assert(std::is_same<NonMoveable&, decltype(nonmoveableOsc.getComponent<0>())>::value, "");
// !!! this does not compile because hana's tuple closure needs to either move or copy
HanaContainer<NonMoveable> nonmoveableHanaC;
static_assert(std::is_same<NonMoveable&, decltype(nonmoveableHanaC.getComponent<0>())>::value, "");
return 0;
}
您可以使用hana::_tuple<...>
类型几乎与std::tuple
完全相同。因此,下面的工作:
#include <boost/hana/integral_constant.hpp>
#include <boost/hana/tuple.hpp>
#include <tuple>
#include <type_traits>
namespace hana = boost::hana;
struct NonMoveable
{
NonMoveable() = default;
NonMoveable(const NonMoveable& other) = delete;
int val;
};
struct Simple { int val; };
template <typename ...CompT>
struct HanaContainer
{
template <int I>
auto& getComponent()
{
return components[hana::int_<I>];
}
hana::_tuple<CompT...> components;
};
int main()
{
HanaContainer<Simple> simpleHanaC;
static_assert(std::is_same<Simple&, decltype(simpleHanaC.getComponent<0>())>::value, "");
HanaContainer<NonMoveable> nonmoveableHanaC;
static_assert(std::is_same<NonMoveable&, decltype(nonmoveableHanaC.getComponent<0>())>::value, "");
return 0;
}
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 增强 Hana index_if和类型
- Boost.Hana:在 constexpr 上下文中将值元组转换为相应类型的元组
- 从具有部分专用化的boost:hana::set中提取类型失败
- 是否可以使用 Boost.Hana 将 std::array 解压缩到非类型模板参数包中
- 使用 hana::transform 在 C++14 中转换元组内的类型
- 为什么BOOST :: HANA :: EXAREMIS ::键入实验功能?类型列表的棘手是什么
- 用于模板的HANA类型
- 使用 boost::hana 获取函数参数的类型
- Boost.Hana:如何检查函数是否具有特定类型的专用性
- 如何根据表达式在Boost.Hana中是否有效来过滤类型元组
- 增强元组类型的hana大小
- 使用boost::hana过滤类型列表
- 创建具有不可移动/不可复制类型的hana元组
- 在集合中提升hana查找类型
- 使用增强 hana 检查特定的嵌套类型/标记