মূল ভাষা
এটি ব্যবহার করে একটি গণক অ্যাক্সেস করা হচ্ছে ::
:
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);
}
নিম্নলিখিতটি সি -+ 0 এক্সে operator int&&
রূপান্তর ফাংশন int&&
এবং int
লজিক্যাল-এবং সি ++ 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);
}
সেই পরীক্ষার কেসটি জিসিসিতে সি ++ 0x এর জন্য কাজ করে না (বাগের মতো দেখায়) এবং ঝাঁকুনির জন্য সি ++ 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();
}
"এটি সি ++ 03 বা সি ++ 0x কিনা" সনাক্ত করে একটি দম্পতি বিরতি পরিবর্তনগুলি প্রদর্শন করতে ব্যবহার করা যেতে পারে। নীচে একটি টুইটযুক্ত টেস্টকেস রয়েছে, যা প্রাথমিকভাবে এই জাতীয় পরিবর্তন দেখাতে ব্যবহৃত হয়েছিল, কিন্তু এখন সি ++ 0 এক্স বা সি ++ 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*
সি ++ 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);
}