핵심 언어
다음을 사용하여 열거 자에 액세스 ::
:
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 모드에서는 작동하지 않습니다. clang PR이 제출되었습니다 .
주입 클래스 이름의 수정 처리 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();
}
몇 가지 "이가 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);
}