這裏的原標題是 解決方法在VS2005çSFINAE錯誤++使用SFINAE檢測在C型++
這是試探性的使用SFINAE的,以便爲is_pod模板類相當於POD岬那存在於TR1中(在VS2005中還沒有TR1)。當模板參數是一個POD類型(包括使他們的基本類型和結構)和假時,它不是(像非平凡的構造函數)它應該有它的價值成員真。
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應該是無效的),這樣既和b評估爲真。
感謝您選擇以下答案。仔細閱讀了他們(和代碼)後,我意識到我正在嘗試做的實際上是一種錯誤的方法。當時的想法是SFINAE行爲與適應相結合,模板must_be_pod(我在書中不完善C++發現,但它可以在其他地方找到,太)。實際上,這需要一套非常特別的SFINAE規則,顯然這不是標準定義的。畢竟,這不是VS中的一個錯誤。
我試圖用char *來使用另一種類型,而不是你所建議的空的結構,但無濟於事。我只是試圖用你的例子,但它給出了相同的結果(對於POD和非POD都是這樣)。 – 2009-02-10 23:35:35