C++: перегрузка Оператора <для указателей на объекты

  1. ' lib/ родительский каталог должен быть в sys.path.

  2. Ваш' lib/__init__.py' мог бы быть похожим на это:

    from . import settings # or just 'import settings' on old Python versions
    class Helper(object):
          pass
    

Тогда следующий пример должен работать:

from lib.settings import Values
from lib import Helper

Ответ на отредактированную версию вопроса:

__init__.py определяет, как Ваш пакет смотрит снаружи. Если необходимо использовать Helper в [1 110], тогда определяют Helper в другом файле, например, 'lib/helper.py'.

.
|   `-- import_submodule.py
    `-- lib
    |-- __init__.py
    |-- foo
    |   |-- __init__.py
    |   `-- someobject.py
    |-- helper.py
    `-- settings.py

2 directories, 6 files

команда:

$ python import_submodule.py

Вывод:

settings
helper
Helper in lib.settings
someobject
Helper in lib.foo.someobject

# ./import_submodule.py
import fnmatch, os
from lib.settings import Values
from lib import Helper

print
for root, dirs, files in os.walk('.'):
    for f in fnmatch.filter(files, '*.py'):
        print "# %s/%s" % (os.path.basename(root), f)
        print open(os.path.join(root, f)).read()
        print


# lib/helper.py
print 'helper'
class Helper(object):
    def __init__(self, module_name):
        print "Helper in", module_name


# lib/settings.py
print "settings"
import helper

class Values(object):
    pass

helper.Helper(__name__)


# lib/__init__.py
#from __future__ import absolute_import
import settings, foo.someobject, helper

Helper = helper.Helper


# foo/someobject.py
print "someobject"
from .. import helper

helper.Helper(__name__)


# foo/__init__.py
import someobject
7
задан 14 September 2009 в 06:39
поделиться

3 ответа

Я пробовал перегрузить оператор, и он, похоже, не работает для указателей,

Верно.

но работает для самих объектов.

Верно.

Так что же такое вопрос?

Вы хотите использовать указатели в отсортированном контейнере?

С:

#include <iostream>
#include <set>

struct X
{
    int x;
};

C ++ 11 и выше

int main()
{
    X       x1; x1.x    = 5;
    X       x2; x2.x    = 6;

    auto compare = [](auto const& lhs, auto const& rhs){return lhs->x < rhs->x;};
    std::set<X*, decltype(compare)> plop(compare);

    plop.insert(&x1);
    plop.insert(&x2);
}

В C ++ 03

struct XPTest
{
    bool operator()(X* const& lhs,X* const& rhs)
    {
        return lhs->x < rhs->x;
    }
};

int main()
{
    X       x1; x1.x    = 5;
    X       x2; x2.x    = 6;

    std::set<X*,XPTest> plop;

    plop.insert(&x1);
    plop.insert(&x2);
}
10
ответ дан 6 December 2019 в 12:53
поделиться
if(*obj1 < *obj2) { /* this should use the overloaded operator. */ }
1
ответ дан 6 December 2019 в 12:53
поделиться

Указатель является собственным типом C ++, и вы можете перегружать операторы только для определенных пользователем типов (т.е. классов).

Если бы это было возможно, это нарушило бы принцип «наименьшего удивления» и заставляют сравнения указателей вести себя по-разному в зависимости от того, было ли ваше определение видимым. Это, вероятно, очень сбивает с толку.

Если вы хотите использовать альтернативное сравнение для использования в контейнере или с алгоритмами, обратите внимание, что вы можете предоставить замену для std :: less по умолчанию в большинстве ассоциативных контейнеров и алгоритмы, требующие частичного порядка.

5
ответ дан 6 December 2019 в 12:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: