Оригинальное название здесь было
Обходной путь для ошибки SFINAE в VS2005 C ++
Это предварительное использование SFINAE для создания эквивалента для класса шаблона is_pod, существующего в TR1 (в VS2005 еще нет TR1). Он должен иметь value member true, если параметр шаблона имеет тип POD (включая примитивные типы и составленные из них структуры), и false, если это не так (как с нетривиальными конструкторами).
template <typename T> class is_pod
{
public:
typedef char Yes;
typedef struct {char a[2];} No;
template <typename C> static Yes test(int)
{
union {T validPodType;} u;
}
template <typename C> static No test(...)
{
}
enum {value = (sizeof(test<T>(0)) == sizeof(Yes))};
};
class NonPOD
{
public:
NonPod(const NonPod &);
virtual ~NonPOD();
};
int main()
{
bool a = is_pod<char>::value;
bool b = is_pod<NonPOD>::value;
if (a)
printf("char is POD\n");
if (b)
printf("NonPOD is POD ?!?!?\n");
return 0;
}
Проблема в том, что не только VS 2005 не имеет TR1, он не будет заботиться о объединении выше (которое не должно быть допустимым, если параметр шаблона не является POD), поэтому и a, и b оценивают как правда.
Спасибо за ответы, размещенные ниже. Внимательно прочитав их (и код), я понял, что то, что я пытался сделать, было действительно неправильным подходом. Идея заключалась в том, чтобы объединить поведение SFINAE с адаптацией к шаблону must_be_pod (который я нашел в книге Несовершенный C ++ , но его можно найти и в других местах). На самом деле, это потребует совершенно определенного набора правил для SFINAE, который, очевидно, не соответствует стандарту. В конце концов, это не совсем ошибка в VS.