derefernable 型に対して次のことを達成するにはどうすればよいですか?
動作させたいすべてのタイプに対してクラステンプレートの特殊化を行う必要があるため、現在のソリューションが不足していることがわかります。
template<typename T>
struct get_value_type
{
typedef typename T::value_type value_type;
};
template<typename E>
struct get_value_type<std::unique_ptr<E>>
{
typedef typename E::value_type value_type;
};
template<typename E>
struct get_value_type<std::shared_ptr<E>>
{
typedef typename E::value_type value_type;
};
template<typename E>
struct get_value_type<boost::optional<E>>
{
typedef typename E::value_type value_type;
};
途中で何かを試しましたが、うまくいきません。
template<typename T, typename IsIndirect = false_type>
get_value_type
{
typedef typename T::value_type value_type;
}
template<typename T>
struct get_value_type<T, true_type>
{
typedef decltype(*boost::declval<E>())::value_type value_type;
};
typedef get_value_type<T, is_indirect<T>::type> value_type;