Оператор перегрузки -> () для изменения возвращаемого значения вызываемой функции - PullRequest
0 голосов
/ 14 февраля 2019

В основном я делаю это:

auto result = from (startNodePtr)
    .to<NodeT1>()
    .to<NodeT2>()
    .to<NodeT3>()
    .fail_with(msg)

в погоне за указателями.Вы можете представить себе «от» и «до», возвращая различные шаблоны класса SyntaxSugar, и fail_with, возвращая результат.Работает нормально.

Но не все так просто.В зависимости от типов узлов, на которых я работаю, мне нужно вызвать некоторую операцию для базового типа.например:

auto result = from(startNodePtr)
    .to<NodeT1>()
    .to<NodeT2>() -> SomeOperation()
    .to<NodeT3>()
    .fail_with(msg)

Операции, в свою очередь, возвращают указатель, который мне снова нужно обернуть в SyntaxSugar.

как мне перегрузить operator->, чтобы правильно сделать это?

Скажите, что мой класс выглядит так:

template<typename Pointer_T>
class SyntaxSugar
{
  Pointer_T ptr;

public:
  explicit SyntaxSugar(Pointer_T ptr_)
    : ptr(ptr_)
  {}

  // all kinds of Syntax Sugar

  // this one I don't get to work:
  auto operator-> () { return SyntaxSugar(ptr.operator->()); }
}

1 Ответ

0 голосов
/ 14 февраля 2019

Это потрясающе, @ max-langhof

Сейчас я делаю

template<typename Op>
    auto SyntaxSugar::apply(Op func) -> decltype(SyntaxSugar(func(ptr)))
    { 
        if (!ptr) {
            fail();
            return SyntaxSugar(nullptr);
        }
        return SyntaxSugar(func(ptr));
    }

, и теперь я могу

auto result = from(startNodePtr)
    .to<NodeT1>()
    .to<NodeT2>()
    .apply([](auto node) { return node->SomeOperation(); })
    .to<NodeT3>()
    .fail_with(msg)
...