编写版本特定的 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
。
在我最近的 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
。