Как создать перегруженные операторы для указателей наддува в C ++? - PullRequest
3 голосов
/ 09 августа 2010

Из этого поста я вижу, что вы не можете перегрузить операторы для указателей: C ++: Перегрузка операторов <для указателей на объекты </a>

Но есть ли способ перегрузить операторы дляповысить указатели?Например:

  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;
  }

При попытке этого я получаю неоднозначную ошибку перегрузки (она конфликтует со встроенным оператором || (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)) { ... }

Я думаю, что я застрял с использованием указателей, потому что я не могу использовать проход по значению (так как я 'я использую полиморфизм), и я не могу использовать проход по константной ссылке (так как был бы временный объект, созданный вложенными операторами, которых не было бы позже при попытке проверить).

Редактировать: Здесь добавлен новый вопрос, специфичный для моей проблемы: Рекомендации по созданию выражения для последующего использования для оценки содержимого карты в c ++?

Ответы [ 3 ]

1 голос
/ 09 августа 2010

Вы, конечно, можете:

#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;
}

Можете ли вы делать то, что делаете в своем примере, я не знаю, так как я не уверен, что вы пытаетесь сделать!

0 голосов
/ 09 августа 2010

Оператор || всегда должен возвращать бул, так что вы не можете (и ради здравомыслия ваших коллег не должны) этого делать. Я предлагаю вам использовать обычную функцию и дать ей имя, которое отражает то, что вы пытаетесь сделать. GetValidatedPtr () или что-то похожее.

0 голосов
/ 09 августа 2010

Ваш подход должен работать, по крайней мере, он у меня работает .

Однако вы всегда будете сталкиваться с проблемами с неоднозначными перегрузками при попытке некоторых пользовательских преобразований на rhs и lhs.

...