Supose мне нужно написать класс, который действует как оболочка для значений:Лучший способ написать значение обертку класс
template<typename T>
struct value_wrapper
{
T value;
value_wrapper(const T& v) : value(v) {}
//etc...
};
Класс dessigned будет использоваться в качестве псевдонима от исходного значения, так что если это значение было rvalue, обертка содержит значение, а если это значение lvalue, то обертка содержит ссылку на него. Класс должен перегружать, скажем, операторы сравнения и использовать таким образом:
template<typename T , typename U>
bool f(const T& lhs , const T& rhs)
{
return wrapper(lhs) == wrapper(rhs);
}
Или это:
int main()
{
int a , b;
bool flag = wrapper(a) == wrapper(b) || wrapper(a) == wrapper(2);
}
Мой вопрос: Что лучший (эффективный) способ реализации такая вещь? Это вопросы, кажется широким, я имею в виду:
- Как определить элемент
value?
КакT&
для lvalues иT
для rvalues? - Есть ли стандартный способ создания такого универсального (rvalue и lvalue) псевдонима?
Чем больше я думаю об этом, тем меньше я понимаю, чего пытается достичь такой класс-оболочка. Можете ли вы рассказать о прецеденте? –
@ DanielFrey, между прочим, я думал написать набор функций сравнения с плавающей точкой, и я хотел бы использовать операторы сравнения. Мне не нравится «стиль Java» 'compare_to (a, b)', я предпочитаю перегрузку операторов. – Manu343726
Интересно. В этом случае вам может понадобиться избегать неявных операторов преобразования, и только они будут помечены как «явные» или с помощью явных функций getter. И тогда вам придется перегружать операторов самостоятельно, возможно, используя [Boost.Operators] (http://www.boost.org/doc/libs/1_53_0/libs/utility/operators.htm) или мои [** df.operators **] (https://github.com/d-frey/operators/), чтобы помочь в этом. –