これをC++11で書く興味深い方法は次のとおりです。
template<typename A, typename B, typename T=void*>
using IfSameBaseType = std::enable_if<
typename std::is_same<
typename std::remove_cv<A>::type,
typename std::remove_cv<B>::type
>::type,
T
>::type;
template <typename T>
class Wrapper
{
public:
template<typename U, typename unused>
Wrapper(U&& u, unused* do_not_use=(IfSameBaseType<T,U>*)nullptr) :
data_( std::forward(u) )
{}
template<typename U>
IfSameBaseType<T,U,Wrapper<Type>>& operator=(U&& x) {
data_ = std::forward(x);
return *this;
}
protected:
T data_;
};
ここで&&
は、型推論コンテキストで使用して、l値とr値の参照に単一のオーバーライドを提供し、それを。を介して渡しstd::forward
ます。このIsSameBaseType
ようなことで、型のコンストラクターのみを記述できるようになります。これを拡張して、それほど面倒なことをせずT
に、「暗黙的にTに変換可能」と言うことができます。IsSameBaseType
これの利点は、重複するメソッドが少ないことです。不利な点は、テンプレートの不正行為がすべての点から誰かの気を散らす可能性があることです。