Перегрузки функций и унаследованные типы не вызывают правильную перегрузку - PullRequest
0 голосов
/ 08 марта 2012

Учитывая следующий базовый класс:

struct ValueType {
    String
    ToString(String const& format) const;
};

Я хочу, чтобы эта перегрузка вызывалась для типов, производных от ValueType:

String FormatValue(const ValueType& value, const String& format)
{
    return value.ToString(format);
}

В противном случае, я хочу, чтобы эта перегрузка былаПозвонил:

template <typename T>
String FormatValue(const T& value, const String& format);

Как я могу гарантировать, что производные типы вместо этого не вызывают вторую перегрузку?

Оригинальный вопрос находится здесь .

1 Ответ

3 голосов
/ 08 марта 2012

Мне не очень нравится то, что вы пытаетесь сделать по разным причинам (включая интерфейс 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...