基本上我正在这样做:
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->()); }
}
答案 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)