можно как то сбросить переопределение оператора?
Можно ли как-то сбросить переопределение оператора (то есть сначала переопределить, а потом вернуться к изначальному назначению), или для этого требуется дважды переопределять?
Можно ли как-то сбросить переопределение оператора (то есть сначала переопределить, а потом вернуться к изначальному назначению), или для этого требуется дважды переопределять?
Так, как Вы описываете - нет, нельзя.
Как вариант, Вы можете определить операторы в разных пространствах имен, например:
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=****
В полном объеме, конечно же, нет.
Вы определяете оператор, когда создаете класс. Это происходит статически, во время компиляции. После создания класса его переопределения в других частях программы невозможны.
Однако, вы можете "смухлевать" и используя препроцессор, определить в разных частях программы разные классы с одинаковым именем (т.е. когда вы смотрите на исходный текст программы, то видите в разных ее местах одно и то же имя, обозначающее на деле разные классы). В таком случае ничто не мешает и переопределить оператор.
Только учтите, что на самом деле при таком подходе вы не сможете использовать переменные этих "одноименных классов" вместе (в общей части кода). Последствия очевидны...
Надеюсь, сказанного достаточно, чтобы и не думать реализовывать эту штуку на практике.