C++ 编写特定于版本的C++;用于检测std命名空间中的符号的代码

C++ 编写特定于版本的C++;用于检测std命名空间中的符号的代码,c++,visual-c++,C++,Visual C++,在我最近的一篇文章中,有人建议我为C++03实现自己的is_same,因为标准版本是C++11的一部分。实施过程非常顺利 template <typename T, typename U> struct is_same { static const bool value = false; }; template <typename T> struct is_same <T, T> { static const bool value = tru

在我最近的一篇文章中,有人建议我为C++03实现自己的
is_same
,因为标准版本是C++11的一部分。实施过程非常顺利

template <typename T, typename U>
struct is_same {
    static const bool value = false;
};

template <typename T>
struct is_same <T, T> {
    static const bool value = true;
};
我想避免这些错误

错误:“is_same”不是“std”//C++03的成员

错误:对“is_same”的引用不明确//C++11


不,您无法检测您的实现是否提供了
std::is_same
,因为这意味着包含
,这在C++03中不存在。即使你能绕过这个障碍,检测它所需的元编程扭曲也不值得

最好是试探性地检查预定义宏的组合:

#if __cplusplus >= 201103L || _MSC_VER >= 1400 || defined(__GXX_EXPERIMENTAL_CXX0X__)
    #include <type_traits>
    #define HAS_STD_IS_SAME
#endif

namespace your_project
{
    #ifdef HAS_STD_IS_SAME
        using std::is_same;
    #else
        template <typename T, typename U> struct is_same { static const bool value = false; };
        template <typename T> struct is_same <T, T> { static const bool value = true; };
    #endif
}
#如果uu cplusplus>=201103L | | | | | MSC | VER>=1400 | |定义(uuuuuugxx uxx_uux0x_uuuu)
#包括
#定义HAS_STD_是否相同
#恩迪夫
为您的项目命名名称空间
{
#如果DEF有标准,则标准相同
使用std::是相同的;
#否则
模板结构是相同的{static const bool value=false;};
模板结构是相同的{static const bool value=true;};
#恩迪夫
}

但是这样做没有任何好处,因为所有实现都将以与您提供的相同的方式实现
是相同的

可能重复@Mikhail,我提到我使用了
\uu cplusplus
,但在windows平台上没有帮助。据我所见,应该定义它。但是,它似乎没有正确定义:为什么不让构建系统处理诸如检查编译器之类的事情,例如使用?
#if __cplusplus >= 201103L || _MSC_VER >= 1400 || defined(__GXX_EXPERIMENTAL_CXX0X__)
    #include <type_traits>
    #define HAS_STD_IS_SAME
#endif

namespace your_project
{
    #ifdef HAS_STD_IS_SAME
        using std::is_same;
    #else
        template <typename T, typename U> struct is_same { static const bool value = false; };
        template <typename T> struct is_same <T, T> { static const bool value = true; };
    #endif
}