如何在C++中为boost指针创建重载运算符?

3
从这篇文章中,我看到您无法为指针重载运算符:C++: Operator overloading of < for pointers to objects 但是,我能否为boost指针重载运算符?例如:
  boost::shared_ptr<ClassB> operator||(boost::shared_ptr<ClassA> lhs, boost::shared_ptr<ClassA> rhs) {
    boost::shared_ptr<ClassB> returnVal = CreateClassBSharedPtr(lhs, rhs);
    return returnVal;
  }

尝试这样做时,我遇到了一个模糊的重载错误(它与内置的operator||(bool, bool)冲突)。有什么办法可以解决这个问题吗?
编辑:在下面添加更多详细信息,说明为什么我想这样做。
我会尽力说明我正在尝试的事情。我想为地图创建一个“验证器”对象,可以检查某些属性是否成立。例如:
boost::shared_ptr<MyValidator> my_validator = IsEmpty("key name 1") && IsNotEmpty("key name 2") || HasNElements("key name 3", num)

稍后,要验证一个地图:
if(my_validator.validate(some_map)) { ... }

我认为我必须使用指针,因为我不能使用传值方式(由于我正在使用多态),也不能使用传递const引用的方式(因为嵌套运算符会创建临时对象,稍后在验证时将不存在)。
编辑:在此添加了一个与我的问题相关的新问题:有关在C++中创建稍后用于评估映射内容的表达式的实现建议?

2
不是回答你的问题,但是... 你为什么要这样做呢?!? - Evan Teran
根据Evan的评论:http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.8 - Patrick
1
那么你真的想构建一个表达式,然后稍后将该表达式应用于映射内容吗?如果是这样,我会就此提出另一个不同的问题,略去共享指针的内容,因为它似乎只是一些实现细节。 - anon
换句话说,不要询问步骤,而是询问问题。 - GManNickG
是的,我理解您的建议。无论如何,我对这个问题很好奇,感谢您的评论。 - md23
3个回答

1

当然可以:

#include "boost/shared_ptr.hpp"

template <class A>
bool operator||(boost::shared_ptr<A> lhs, boost::shared_ptr<A> rhs) {
    return true;
}

int main() {
    boost::shared_ptr <int> a, b;
    bool x = a || b;
}

无法确定你在尝试什么,所以我不知道你是否可以像你的示例一样做!


抱歉格式不好,我无法弄清楚如何使其正确显示。请注意,我正在尝试返回一个boost::ptr,并执行以下操作:template <class A, class B> boost::shared_ptr<B> operator||(boost::shared_ptr<A> lhs, boost::shared_ptr<A> rhs) { boost::shared_ptr<B> x; return x; } ... boost::shared_ptr<int> a, b; boost::shared_ptr<int> c = a || b;但是我遇到了这个错误: error: conversion from 'bool' to non-scalar type 'boost::shared_ptr<int>' requested - md23

0

你的方法应该是可行的,至少对我来说有效

然而,当尝试在rhslhs上进行一些用户定义转换时,你将始终遇到模糊重载的问题。


0

Operator||必须始终返回一个bool值,因此您不能这样做(为了您同事的理智起见,也不应该这样做)。我建议您使用一个常规函数,并给它一个反映您尝试执行的操作的名称。例如GetValidatedPtr()或类似的名称。


没有什么规定运算符||必须返回bool类型,但当然最好这样做。 - anon
如果标准不要求,那我个人要求! - Alan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接