У меня есть класс с двумя определениями порядка.(В реальной задаче один - это полный порядок, а другой - полупорядочение.) Но приятно иметь возможность использовать операторы сравнения, а не всегда использовать явную функцию сравнения или объект функтора.Так что я решил предоставить несколько операторов сравнения, таких как:
class C;
namespace Order1 {
bool operator< (const C&, const C&);
}
namespace Order2 {
bool operator< (const C&, const C&);
}
Операторы для >
, <=
, >=
также определены, но это не главное.Теперь пользователь может сказать using namespace Order1;
или ... Order2
в области видимости файла или блока и получить запрошенное поведение для остальной части этого файла / блока.
Неутешительная часть, которую я хотел бычтобы улучшить, если возможно, это то, что эти using
s не могут быть вложенными.
void g(const C&, const C&);
using namespace Order1; // for most functions in this file
void f(const C& x, const C& y) {
bool test1 = x < y; // Order1
{
// Would like to switch to Order2 for this block.
using namespace Order2;
bool test2 = x < y; // Ambiguous overload!
g(x, y); // Unaffected by local using-s.
}
}
Поскольку директивы using
ничего не скрывают при использовании в одном и том же пространстве имен, это не обеспечиваетспособ приятно временно изменить значение операторов для области видимости блока.
Другая связанная с этим идея заключается в том, чтобы позволить фиктивным объектам в стеке, чьи конструкторы и деструкторы манипулируют «текущими настройками», для которых нужно использовать поведение.Но я не думаю, что хочу идти таким путем в этой ситуации, поскольку это означало бы, что эквивалент f
выше может изменить поведение других функций, называемых как g
.
Есть ли другой способполучить подобный эффект, но позволяя вложенным операциям с самым внутренним блоком «скрывать» остальные?Или я застрял с одним поведением перегруженных операторов на декларативный регион?Я полагаю, что это управляемо, так как код все еще может явно использовать функцию или функтор вместо использования операторов.