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

Write version specific C++ code to detect symbol in std namespace

在我最近的 中,有人建议我为 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;
};

我希望它 仅当它未在 std 命名空间 中定义时才应使用。例如,它可以像这样包装在预处理器块中吗?

#if !defined(std::is_same)
// define is_same here
#endif

我想避免这些错误

error: 'is_same' is not a member of 'std' // C++03

error: reference to 'is_same' is ambiguous // C++11

不,您无法检测您的实现是否提供 std::is_same,因为那将意味着包括 <type_traits>,这在 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
}

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