Ваш конструктор:
template<typename S0>
explicit MyType(S0 &&c_0)
является чрезмерно общим, и лучший способ решить вашу проблему - ограничить тип, который может быть выведен как S0
. Это в основном то, что делает связанный ответ. Но, возможно, я смогу сделать его более привлекательным для вас.
Вот оно, в std :: C ++ 11:
template<typename S0,
class = typename std::enable_if
<
std::is_convertible<S0, T0>::value
>::type>
explicit MyType(S0 &&c_0) : m_value(std::forward<S0>(c_0)) {
}
Если это слишком уродливо, вы можете подумать:
#define restrict_to(x...) class = typename std::enable_if<x>::type
...
template<typename S0, restrict_to(std::is_convertible<S0, T0>::value)>
explicit MyType(S0 &&c_0) : m_value(std::forward<S0>(c_0)) {
}
Обратите внимание, что это не только решит вашу проблему, но и если ваши клиенты впоследствии задают такие вопросы, как:
std::is_convertible<X, MyType<T>>::type
теперь они получат правильный ответ. Как у вас сейчас написано, вышеуказанная черта всегда отвечает истине.