Мне не очень нравится то, что вы пытаетесь сделать по разным причинам (включая интерфейс ValueType
, почему бы не использовать AnyToString
всегда?), Но в любом случае вы сможете решить свою проблему с SFINAE
template <typename T>
typename enable_if< !is_base_of<ValueType, T>::value, String>::type
FormatValue( T const & value, const String& format ) { ... }
То, что делает этот код (когда вы его компилируете :), блокирует функцию шаблона при выполнении условия. Когда компилятор рассматривает шаблон как перегрузку, он попытается заменить тип, и в экземпляре enable_if
не будет вложенного type
, если условие выполнено, поэтому замена завершится неудачно, и шаблон будет отброшен. После этого лучшей перегрузкой будет версия, которая принимает объект ValueType
.