कोर भाषा
एक एन्यूमरेटर का उपयोग करना ::
:
template<int> struct int_ { };
template<typename T> bool isCpp0xImpl(int_<T::X>*) { return true; }
template<typename T> bool isCpp0xImpl(...) { return false; }
enum A { X };
bool isCpp0x() {
return isCpp0xImpl<A>(0);
}
आप नए कीवर्ड का दुरुपयोग भी कर सकते हैं
struct a { };
struct b { a a1, a2; };
struct c : a {
static b constexpr (a());
};
bool isCpp0x() {
return (sizeof c::a()) == sizeof(b);
}
इसके अलावा, यह तथ्य कि स्ट्रिंग शाब्दिक अब रूपांतरित नहीं होते हैं char*
bool isCpp0xImpl(...) { return true; }
bool isCpp0xImpl(char*) { return false; }
bool isCpp0x() { return isCpp0xImpl(""); }
मैं नहीं जानता कि संभावित रूप से वास्तविक कार्यान्वयन पर आपके पास यह काम करने की कितनी संभावना है। एक वह जो शोषण करता हैauto
struct x { x(int z = 0):z(z) { } int z; } y(1);
bool isCpp0x() {
auto x(y);
return (y.z == 1);
}
निम्नलिखित इस तथ्य पर आधारित है कि C ++ 0x में operator int&&
रूपांतरण फ़ंक्शन है int&&
, और int
तार्किक-और C ++ 03 के बाद रूपांतरण
struct Y { bool x1, x2; };
struct A {
operator int();
template<typename T> operator T();
bool operator+();
} a;
Y operator+(bool, A);
bool isCpp0x() {
return sizeof(&A::operator int&& +a) == sizeof(Y);
}
वह परीक्षण-मामला GCC में C ++ 0x के लिए काम नहीं करता है (बग जैसा दिखता है) और clang के लिए C ++ 03 मोड में काम नहीं करता है। एक क्लेंग पीआर दायर किया गया है ।
इंजेक्शन वर्ग नामों में से संशोधित उपचार सी ++ 11 में टेम्पलेट्स में से:
template<typename T>
bool g(long) { return false; }
template<template<typename> class>
bool g(int) { return true; }
template<typename T>
struct A {
static bool doIt() {
return g<A>(0);
}
};
bool isCpp0x() {
return A<void>::doIt();
}
"यह पता लगाना कि यह C ++ 03 है या C ++ 0x" का एक जोड़ा ब्रेकिंग परिवर्तन प्रदर्शित करने के लिए उपयोग किया जा सकता है। निम्नलिखित एक घुमा हुआ टेस्टकेस है, जिसका इस्तेमाल शुरू में इस तरह के बदलाव को प्रदर्शित करने के लिए किया गया था, लेकिन अब इसका उपयोग C ++ 0x या C ++ 03 के लिए किया जाता है।
struct X { };
struct Y { X x1, x2; };
struct A { static X B(int); };
typedef A B;
struct C : A {
using ::B::B; // (inheriting constructor in c++0x)
static Y B(...);
};
bool isCpp0x() { return (sizeof C::B(0)) == sizeof(Y); }
मानक पुस्तकालय
operator void*
C ++ 0x ' की कमी का पता लगानाstd::basic_ios
struct E { E(std::ostream &) { } };
template<typename T>
bool isCpp0xImpl(E, T) { return true; }
bool isCpp0xImpl(void*, int) { return false; }
bool isCpp0x() {
return isCpp0xImpl(std::cout, 0);
}