首页 > 解决方案 > 是否可以将integral_constant 转换为hana::string

问题描述

我希望能够生成一个包含编译时整数的编译时字符串,就像这样。是否可以?

我知道我可以将单个元素插入boost::stringusing 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; 
};

我希望能找到一种方法来让cequal "test_nr_42"_s

标签: boost-hana

解决方案


不幸的是,Boost.Hana 不支持将整数转换为hana::string,并且隐式转换是正确的。

但是,只需稍加一点constexprEuclideanRing我们就可以制作我们自己的转换函数,如下所示:

#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, "");
}

推荐阅读