假设我需要编写一个类来充当值的包装器:
template<typename T>
struct value_wrapper
{
T value;
value_wrapper( const T& v ) : value( v ) {}
//etc...
};
该类被设计为用作原始值的别名,因此如果该值是右值,则包装器将保存该值,如果它是左值,则包装器将保存对其的引用。
该类应该重载比较运算符,并以这种方式使用:
template<typename T , typename U>
bool f( const T& lhs , const T& rhs )
{
return wrapper( lhs ) == wrapper( rhs );
}
Or this:
int main()
{
int a , b;
bool flag = wrapper( a ) == wrapper( b ) || wrapper( a ) == wrapper( 2 );
}
我的问题是:实施此类事情的最佳(有效)方法是什么?这些问题似乎很广泛,我的意思是:
- 我如何定义成员
value?
As T&
对于左值,以及T
对于右值?
- 是否有任何标准方法来编写这种通用(右值和左值)别名?
我只是提供合适的转换运算符:
#include <utility>
#include <type_traits>
template <typename T> struct Wrapper
{
static_assert(!std::is_reference<T>::value, "Do not use a reference type");
using type = T;
T value;
Wrapper(T && t) : value(std::move(t)) {}
Wrapper(T const & t) : value(t) {}
operator T const & () const noexcept { return value; }
operator T & () & noexcept { return value; }
operator T && () && noexcept { return std::move(value); }
// maybe some more CV variants...
};
template <typename U> struct Wrapper<U &>
{
using type = U &;
U & ref;
Wrapper(U & u) : ref(u) {}
operator U & () { return ref; }
};
我会用一个推导函数来配合它:
template <typename T> Wrapper<T> wrap(T && t)
{ return Wrapper<T>(std::forward<T>(t)); }
用法示例:
int n = 10;
bool b = wrap(n) == wrap(5 + 5)
转换运算符允许您使用在基础类型上定义的任何运算符。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)