У меня есть класс шаблона, который необходимо специализировать для параметров шаблона, содержащих определенный typedef. Поэтому мне нужно два определения, одно для случая, когда у него есть typedef, а другое для случая, когда его нет.
Моя проблема в том, что я не вижу, как отрицать SFINAE. Очевидно, я мог бы исключить особый случай для неспециального параметра, но я не знаю, как исключить вариант по умолчанию для специального параметра.
Поэтому я попробовал частичную специализацию следующим образом:
struct NormalType { };
struct SpecialType { typedef int special; };
template <typename T, typename IsSpecial = void>
struct DetectSpecial {
void detected() { std::cout << "Not special...\n"; }
};
template <typename T>
struct DetectSpecial<T, typename T::special> {
void detected() { std::cout << "Special!\n"; }
};
но специализация не используется (как SSCCE на ideone).
Я также рассматривал возможность использования enable_if
, но не понимаю, как его использовать для правильных и неправильных выражений, а не true/false.
Каков самый простой способ определить DetectSpecial
по-разному для типов, содержащих определенный typedef (значение typedef может быть любым; важно его присутствие)?
О, я все еще застрял с некоторыми компиляторами C++03. В любом случае, я не думаю, что что-то изменится в SFINAE.
T::special
неvoid
. Когда вы создаете экземплярDetectSpecial<SpecialType>
, вы создаете экземплярDetectSpecial<SpecialType, void>
, который не соответствуетDetectSpecial<SpecialType, int>
(частичная специализация). - person dyp   schedule 24.02.2014