Предположим, что у меня есть некоторый объект типа T
, и я хочу поместить его в ссылочную оболочку:
int a = 5, b = 7;
std::reference_wrapper<int> p(a), q(b); // or "auto p = std::ref(a)"
Теперь я могу легко сказать if (p < q)
, потому что эталонная оболочка имеет преобразование в свой завернутый тип. Все счастливы, и я могу обработать набор ссылочных оберток, как и исходные объекты.
(Как показывает приведенный ниже вопрос, приведенный ниже, это может быть полезным способом для создания альтернативного представления существующей коллекции, которая может быть переупорядочена по желанию без каких-либо затрат на полную копию, а также с сохранением целостности обновления с исходной коллекцией.)
Однако, с некоторыми классами это не работает:
std::string s1 = "hello", s2 = "world";
std::reference_wrapper<std::string> t1(s1), t2(s2);
return t1 < t2; // ERROR
Мое обходное решение - определить предикат , как в этот ответ *; но мой вопрос:
Почему и когда операторы могут применяться к ссылочным оберткам и прозрачно использовать операторов обернутых типов? Почему это не работает для std::string
? Что это связано с тем, что std::string
является экземпляром шаблона?
*) Обновление. В свете ответов кажется, что использование std::less<T>()
является общим решением.