В моем шаблоне мне нужно иметь разные части кода в зависимости от того, является ли имя типа фундаментальным типом или нет.
Компиляция этого кода дает C4067 в MSVC (неожиданные токены после директивы препроцессора - ожидается новая строка):
template <typename T>
void MyClass<T>::foo()
{
// ... some code here
#if std::is_fundamental<T>::value
if(m_buf[j] < m_buf[idx_min])
idx_min = j;
#else
const ASSortable& curr = dynamic_cast<ASSortable&>(m_buf[j]);
const ASSortable& curr_min = dynamic_cast<ASSortable&>(m_buf[idx_min]);
// error checking removed for simplicity
if(curr.before(curr_min))
idx_min = j;
}
#endif
Шаблон должен работать как с примитивными, так и с моими собственными (полученными из ASSortable) типами данных, и ошибка возникает из кода создания экземпляра шаблона:
template class MyClass<char>;
Попытка изменить выражение прекомпилятора на это тоже не сработала:
#if std::is_fundamental<T>::value == true
и выдает точно такое же предупреждение.
Любые идеи, как сделать этот код без предупреждений?
Редактировать Еще одна вещь, которая приходит на ум, — преобразовать это в проверку во время выполнения и жить с предупреждением «постоянное выражение if»... Неужели нет способа сделать это элегантно в одна функция без специализаций и лишних наворотов?
Редактировать #2 Итак, способ, которым я решил эту проблему (что было очевидно, но почему-то ускользнуло от меня...), состоял в том, чтобы определить bool ASSortable::operator<(const ASSortable& _o) const {return this->before(_o);};
, который выполняет свою работу и делает код чистым (еще раз).
Больше никаких if
или #ifdef
или подобных помех в моем коде!
Не могу поверить, что я даже задал этот вопрос, ведь на него был такой очевидный и простой ответ :(
MyClass
? - person Björn Pollex   schedule 12.07.2012enable_if
, чтобы предотвратить специализацию класса для одной специализированной перегрузки. Мое решение делает это. - person pmr   schedule 12.07.2012ASSortable
? У нас уже естьoperator<
. - person Puppy   schedule 28.07.2012