在我最近的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
不,您无法检测您的实现是否提供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与您提供的方式相同的方式实现.
| 归档时间: |
|
| 查看次数: |
286 次 |
| 最近记录: |