重载operator->()以更改被调用函数的返回值

时间:2019-02-14 10:27:45

标签: c++ c++14

基本上我正在这样做:

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)

操作将依次返回一个Pointer,我再次需要包装它 在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 :(得分:0)

太神奇了,@ 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)