ここでの元のタイトルは 、VS2005 C++ の SFINAE バグの回避策でした。
これは、TR1 に存在する is_pod テンプレート クラスに相当するものを作成するための SFINAE の暫定的な使用です (VS2005 にはまだ TR1 はありません)。テンプレート パラメーターが POD 型 (プリミティブ型とそれらで作成された構造体を含む) の場合は値メンバーを true にし、そうでない場合 (非自明なコンストラクターなど) は 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 の両方が true と評価されることです。
以下に投稿された回答に感謝します。それら (およびコード) を注意深く読んだ後、私がやろうとしていたことは本当に間違ったアプローチであることに気付きました。アイデアは、SFINAE の動作をテンプレートmust_be_podへの適応と組み合わせることでした (本Imperfect C++で見つけましたが、別の場所でも見つけることができます)。実際、これには SFINAE の非常に特殊なルール セットが必要になりますが、これは明らかに標準で定義されているものではありません。結局のところ、これは実際には VS のバグではありません。