boost-hana - 是否可以将integral_constant 转换为hana::string
问题描述
我希望能够生成一个包含编译时整数的编译时字符串,就像这样。是否可以?
我知道我可以将单个元素插入boost::string
using fold_left
,但我想添加整数的十进制表示。有没有允许这样做的图书馆?
#include <boost/hana/string.hpp>
#include <boost/hana/integral_constant.hpp>
#include <boost/hana/plus.hpp>
namespace hana = boost::hana;
using namespace hana::literals;
int main() {
auto a = "test_nr_"_s;
auto b = 42_c;
auto c = a + b;
};
我希望能找到一种方法来让c
equal "test_nr_42"_s
。
解决方案
不幸的是,Boost.Hana 不支持将整数转换为hana::string
,并且隐式转换是正确的。
但是,只需稍加一点constexpr
,EuclideanRing
我们就可以制作我们自己的转换函数,如下所示:
#define BOOST_HANA_CONFIG_ENABLE_STRING_UDL
#include <boost/hana.hpp>
namespace hana = boost::hana;
using namespace hana::literals;
constexpr size_t get_magnitude(size_t num) {
unsigned i = 0;
while (num > 0) {
num /= 10;
++i;
}
return i;
}
template <typename X, size_t ...i>
constexpr auto to_string(X x,
std::index_sequence<i...>) {
constexpr size_t mag = get_magnitude(X::value);
return hana::string<
(x / hana::power(hana::size_c<10>,
hana::size_c<mag - i - 1>) % hana::size_c<10>
+ hana::size_c<48>)...>{};
}
template <typename X>
constexpr auto to_string(X x) {
return to_string(hana::size_c<static_cast<size_t>(X::value)>,
std::make_index_sequence<get_magnitude(X::value)>());
}
int main() {
auto a = "test_nr_"_s;
auto b = 42_c;
auto c = a + to_string(b);
static_assert(c == "test_nr_42"_s, "");
}
推荐阅读
- android - Android ViewModel 观察者永远不会被调用
- jquery - Jquery SerializeArray 和推送对象列表
- python - 网页抓取
- 标签
- python - 如何更改 pip 安装到错误的 python 副本的事实?
- html - 如何在 jquery LightSlidder 中使用居中图像设置固定高度?
- python - 如何从 findHomography 中获取旋转角度?
- mysql - 在启动时创建数据库视图 - JPA
- pdf - Craft Pro 3.1.33 - 在管理员用户配置文件中下载 PDF
- php - 为什么php函数exec()返回状态码2
- here-api - HERE geocode API 拉丁化地址