можно как то сбросить переопределение оператора?

Рейтинг: 1Ответов: 2Опубликовано: 07.08.2023

Можно ли как-то сбросить переопределение оператора (то есть сначала переопределить, а потом вернуться к изначальному назначению), или для этого требуется дважды переопределять?

Ответы

▲ 7Принят

Так, как Вы описываете - нет, нельзя.

Как вариант, Вы можете определить операторы в разных пространствах имен, например:

namespace Lib
{
    struct Credentials
    {
        std::string username;
        std::string password;
    };

    namespace NonSecure
    {
        std::ostream& operator<<(std::ostream& stream, const Credentials& credentials)
        {
            return stream << "username=" << credentials.username << ","
                          << "password=" << credentials.password;
        }
    }

    namespace Secure
    {
        std::ostream& operator<<(std::ostream& stream, const Credentials& credentials)
        {
            return stream << "username=" << credentials.username << ","
                          << "password=" << std::string(credentials.password.size(), '*');
        }
    }
}

А затем, в зависимости от ситуации, вводить в текущее пространство имен нужный Вам оператор:

int main()
{
    Lib::Credentials c { "user", "pass" };

    {
        using namespace Lib::NonSecure;
        // или так: using Lib::NonSecure::operator<<;
        std::cout << c << std::endl;
    }

    {
        using namespace Lib::Secure;
        // или так: using Lib::Secure::operator<<;
        std::cout << c << std::endl;
    }
}

Вывод:

username=user,password=pass
username=user,password=****

▲ 3

В полном объеме, конечно же, нет.

Вы определяете оператор, когда создаете класс. Это происходит статически, во время компиляции. После создания класса его переопределения в других частях программы невозможны.

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

Только учтите, что на самом деле при таком подходе вы не сможете использовать переменные этих "одноименных классов" вместе (в общей части кода). Последствия очевидны...

Надеюсь, сказанного достаточно, чтобы и не думать реализовывать эту штуку на практике.