Как перевернуть hana :: string - PullRequest
       37

Как перевернуть hana :: string

0 голосов
/ 14 декабря 2018

Кто-нибудь знает, как отменить повышение :: 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 doc гласит:

В частности, не следует принимать как должное то, что параметрами шаблона являются символы.Правильный способ доступа к содержимому hana :: string как символьных констант - это использовать hana :: unpack, .c_str () или hana :: to

Итак, я предполагаю направление, в которомвыглядит как "как преобразовать строку hana :: в последовательность "

спасибо!

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

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)


  );
}
0 голосов
/ 14 декабря 2018

Хм, мне пришлось немного покопаться во внутренностях струны ханы.

Но Хана восхитительно функциональна, так что этого короткого решения достаточно:

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 без шумов шаблона.

...