【问题标题】:How to reverse a hana::string如何反转一个hana::string
【发布时间】:2018-12-14 17:17:27
【问题描述】:

有人知道如何反转 boost::hana::string 吗?

以下不起作用:

#include <boost/hana.hpp>
#include <boost/hana/reverse.hpp>
auto s = BOOST_HANA_STRING("abc");
auto s2 = boost::hana::reverse(s);

带有错误信息:

boost/hana/reverse.hpp:36:9: error: static_assert failed due to requirement 
'hana::Sequence<S>::value' "hana::reverse(xs) 
 requires 'xs' to be a Sequence"

hana string doc 说:

特别是,不应理所当然地认为模板参数是字符。将 hana::string 的内容作为字符常量访问的正确方法是使用 hana::unpack、.c_str() 或 hana::to

所以,我猜看的方向是“如何将 hana::string 转换为 Sequence

谢谢!

【问题讨论】:

    标签: c++ templates boost-hana


    【解决方案1】:

    Boost.Hana 确实是函数式的,但如果您可以避免折叠类型,您可以获得一个编译时效率更高的算法。

    #include <array>
    #include <boost/hana.hpp>
    
    namespace hana = boost::hana;
    
    template <typename S, unsigned long ...i>
    auto reverse_string_impl(S s, std::index_sequence<i...>) {
      constexpr unsigned long n = sizeof...(i);
      constexpr char const* c = hana::to<char const*>(s);
      return hana::make_string(hana::char_c<c[n - i - 1]>...);
      // would be better but assumes stuff about the impl of hana::string
      //return hana::string<c[n - i - 1]...>{};
    }
    
    template <typename S>
    constexpr auto reverse_string(S) {
      return reverse_string_impl(S{},
        std::make_index_sequence<hana::length(S{})>{});
    }
    
    int main() {
      BOOST_HANA_CONSTANT_ASSERT(
          BOOST_HANA_STRING("foo") == reverse_string(BOOST_HANA_STRING("oof"))
      );
    
      // or just convert to a tuple and back (less efficient)
      BOOST_HANA_CONSTANT_ASSERT(
          BOOST_HANA_STRING("foo") ==
            hana::unpack(
              hana::reverse(hana::unpack(BOOST_HANA_STRING("oof"),
                            hana::make_tuple)),
              hana::make_string)
    
    
      );
    }
    

    【讨论】:

      【解决方案2】:

      嗯,我不得不深入挖掘一下hana字符串的内部。

      但是 Hana 的功能很好,所以这个简短的解决方案就足够了:

      auto reverse_boost_hana_string = [](auto s) {
          auto add_reverse = [=](auto xs, auto ys) {
              auto ys_s = boost::hana::string<ys>(); // this is what I had wrong for a while
              return ys_s + xs;
          };
          auto reversed = boost::hana::fold_left(s, BOOST_HANA_STRING(""), add_reverse);
          return reversed;
      };
      
      
      int main()
      {
          auto s = BOOST_HANA_STRING("abcdef");
          auto s2 = reverse_boost_hana_string(s);
          std::cout << "Reversed ==>" <<  s2.c_str() << "<==\n";
      }
      

      在没有模板噪音的情况下编写 TMP 非常令人愉快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-01
        • 2011-06-24
        • 2015-11-18
        • 2020-06-12
        • 2021-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多