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

Shr*_*han 3 c++ visual-c++

在我最近的QA中,is_same由于标准版本是C++ 11的一部分,我被建议为C++ 03 实现自己的QA.实施是

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;
};
Run Code Online (Sandbox Code Playgroud)

我希望只有在std命名空间中没有定义时才应该使用它.例如,它可以包装在这样的预处理器块中吗?

#if !defined(std::is_same)
// define is_same here
#endif
Run Code Online (Sandbox Code Playgroud)

我想避免这些错误

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

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

Okt*_*ist 6

不,您无法检测您的实现是否提供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
}
Run Code Online (Sandbox Code Playgroud)

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