Ngôn ngữ chính
Tiếp cận điều tra viên bằng ::
:
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);
}
Bạn cũng có thể lạm dụng các từ khóa mới
struct a { };
struct b { a a1, a2; };
struct c : a {
static b constexpr (a());
};
bool isCpp0x() {
return (sizeof c::a()) == sizeof(b);
}
Ngoài ra, thực tế là các ký tự chuỗi không còn chuyển đổi thành char*
bool isCpp0xImpl(...) { return true; }
bool isCpp0xImpl(char*) { return false; }
bool isCpp0x() { return isCpp0xImpl(""); }
Tuy nhiên, tôi không biết bạn có khả năng làm điều này như thế nào trên một triển khai thực sự hay không. Một khai thácauto
struct x { x(int z = 0):z(z) { } int z; } y(1);
bool isCpp0x() {
auto x(y);
return (y.z == 1);
}
Điều sau dựa trên thực tế operator int&&
là một hàm chuyển đổi thành int&&
trong C ++ 0x và một chuyển đổi thành int
theo sau bởi logic-và trong 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);
}
Trường hợp thử nghiệm đó không hoạt động đối với C ++ 0x trong GCC (có vẻ như lỗi) và không hoạt động ở chế độ C ++ 03 đối với tiếng kêu. Một PR rõ ràng đã được đệ trình .
Các điều trị sửa đổi của tên lớp tiêm mẫu trong C ++ 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();
}
Một vài "phát hiện xem đây là C ++ 03 hay C ++ 0x" có thể được sử dụng để chứng minh các thay đổi đột phá. Sau đây là một testcase đã được tinh chỉnh, ban đầu được sử dụng để chứng minh sự thay đổi như vậy, nhưng bây giờ được sử dụng để kiểm tra C ++ 0x hoặc 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); }
Thư viện tiêu chuẩn
Phát hiện thiếu operator void*
trong 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);
}