Boost Hana :将 Hana 类型转换为 std::string

2024-01-25

是否存在用于编译时转换 a 成员类型的 Boost Hana 方法Struct类型名的 std::string 的 STL 容器的概念?

例如,

MyType t();
std::array<std::string, 3> ls = boost::hana::typesToString(t);
for(std::string x : ls){
     std::cout << x << std::endl;
}

将“int string bool”输出到 STDOUT,

With

class MyType{
     int x; 
     std::string y;
     bool z;
}

该文档清楚地提供了获取实例的成员及其值的方法Struct概念,但我还没有找到任何可以做到这一点的东西成员类型。一个更简单的任务是:

 int x;
 std::string tName = boost::hana::typeId(x); //tName has value "int"

我读了这个帖子 https://stackoverflow.com/questions/81870/is-it-possible-to-print-a-variables-type-in-standard-c但我想知道 Hana 是否有一种开箱即用的干净方法。更好的是一种迭代成员的方法Struct无需知道他们的名字。


如果您使用 Clang,Hana 有一个实验性功能hana::experimental::type_name http://boostorg.github.io/hana/group__group-experimental.html#gaf14876d1f1a3c42ce7a0243d7b263bec。这可用于获取结构成员的类型名称:

#include <boost/hana.hpp>
#include <boost/hana/experimental/type_name.hpp>

namespace hana = boost::hana;

template <typename Struct>
auto member_type_names() {
    constexpr auto accessors = hana::accessors<Struct>();

    return hana::transform(
        accessors,
        hana::compose(
            [](auto get) {
                using member_type
                    = std::decay_t<decltype(get(std::declval<Struct>()))>;

                return hana::experimental::type_name<member_type>();
            },
            hana::second
        )
    );
}

Demo (在 Wandbox 上直播 https://wandbox.org/permlink/uuhN0Ua9oYGvhmmy):

#include <iostream>
#include <string>

struct MyType {
    int a;
    std::string b;
    float c;
};

BOOST_HANA_ADAPT_STRUCT(MyType, a, b, c);

int main() {
    hana::for_each(member_type_names<MyType>(), [](auto name) {
        // Note that the type of `name` is a hana::string, not a std::string
        std::cout << name.c_str() << '\n';
    });
}

Outputs:

int
std::__1::basic_string<char>
float
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Boost Hana :将 Hana 类型转换为 std::string 的相关文章

随机推荐

  • 将一个符号向后排列,Haskell [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我如何将一个符号重新排列回来 我有一个给定的字符串 abcdpqrs 其中输出为 badcqpsr 我当前的代码 f s foldr a x
  • 100% 内存 HSQL 数据库

    我有一个 Java 应用程序设置为服务 每隔几个小时对大约 3GB 的数据进行数据挖掘 我希望这 100 发生在记忆中 理想情况下 我希望应用程序与所有事物隔离 我希望它构建数据库 进行我需要的挖掘 并在完成后拆除数据库 然而 对于 HSQ
  • 如何在单引号中使用 bash 变量

    我的 bash 代码如下 payload text failure with VAR failed for 但变量未解析为实际值 请不要给出否定 因为我在 Bash 方面没有太多经验 变量不会在单引号中扩展 这意味着您只需确保它们不是单引号
  • MKMapView 完全缩小时的缩放问题

    我通过单击按钮缩小地图 因此 当地图完全缩小时 如果我尝试再次缩小它 那么它在设置区域时会崩溃 不确定 但是有什么方法可以检测地图是否达到最大缩放限制吗 这是我缩小地图的代码 void setZoomLevelForNoPicksCurre
  • AJAX、PHP 会话和同时请求[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我就直接进入正题吧 当用户提交搜索时
  • 我在 env 渲染中遇到错误 - env.render()

    我试图在渲染时实现 Atari Games 但出现如下错误 line 283 in render raise error Error gym error Error render mode human is deprecated Pleas
  • 网络表单中的构造函数?

    我有一个 ASP NET Web 表单 我在其中初始化一个数组 其中包含页面上的控件列表 如下所示 FileUpload 4 new FileUpload 4 public myclass fileUpload 0 FileUpload1
  • PyCharm 中“没有名为管理的模块”

    我在使用 PyCharm 时遇到问题 当我单击 工具 中的 运行 Django 控制台 或 运行管理 py 任务 时 我得到 Traceback most recent call last File
  • 为iPhone 5创建opencv相机矩阵solvepnp

    我正在使用 opencv 为 iPhone 开发一个应用程序 我必须使用方法solvePnPRansac http opencv willowgarage com documentation cpp camera calibration a
  • 即使使用动态高度网站,如何将页脚保持在底部

    当我有一个使用 CSS 动态设置高度 例如从数据库获取信息 的页面时 如何将页脚 div 始终保持在窗口底部 如果你想使用 jQuery 我想出了这个并且工作得很好 设置页脚的 CSS footer position absolute wi
  • 将 props 传递到 React 组件

    我刚刚开始学习 React 正在创建组件并将 props 传递给它们 我是否必须在下面的示例中引用 JSX 元素中的 props 我已经看到过引用 props 和未引用 props 的示例 并且这两个选项似乎都有效 const name J
  • 如何获得可靠的 Cortex M4 短延迟

    我正在将一些代码从 M3 移植到 M4 它使用 3 个 NOP 在串行输出时钟更改之间提供非常短的延迟 M3指令集将NOP的时间定义为1个周期 我注意到 M4 中的 NOP 并不一定会延迟任何时间 我知道我需要禁用编译器优化 但我正在寻找一
  • 如何使用 Handlebars.js 将字段小写?

    我想做这样的事情 user name toLowerCase 但我收到此错误 Error Parse error on line X tatus user name toLowerCase gt Expecting ID got undef
  • 如何使输入可观察?

    我有一个带有一些输入的组件 我希望在它发生更改时收到通知 我目前通过实施来使其工作ngOnChanges并找出哪个输入被更改 但是 我更愿意将输入声明设置为 Input select values selectValues Observab
  • For 循环范围必须有一个“iterator()”方法

    我遇到了这个奇怪的错误 val limit Int applicationContext resources getInteger R integer popupPlayerAnimationTime for i in limit 我找到了
  • 如何以编程方式添加多列 ListViewItem 而无需任何数据绑定?

    我有一个带有 3 个标头的 ListView 在 XAML 中声明如下
  • Mono 运行时的局限性

    我的问题类似于this one https stackoverflow com questions 802559 limitations in mono for a net framework developer and this one
  • 将 Chart JS 2 上的条形图扩展为新型图表

    我实际上正在使用 Chart JS 2 0 1 在页面上绘制图表 我的客户要求我在条形图中添加一条线 以便他们可以看到他们不能超过的限制 像那样 y 轴上有线条的条形图 https i stack imgur com 5XJO4 png 因
  • 使用 Apache POI 合并 Excel 中的单元格

    还有其他方法可以使用 Apache POI 库合并 Excel 中的单元格吗 我正在尝试使用以下内容 但它不起作用 selecting the region in Worksheet for merging data CellRangeAd
  • Boost Hana :将 Hana 类型转换为 std::string

    是否存在用于编译时转换 a 成员类型的 Boost Hana 方法Struct类型名的 std string 的 STL 容器的概念 例如 MyType t std array