我正在努力实施std::is_enum.到目前为止,这是我的代码:
template<typename T>
struct is_enum {
static bool value;
};
template<typename T>
bool is_enum<T>::value = false;
template<enum E>
struct is_enum {
static bool value;
};
template<enum E>
bool is_enum<E>::value = true;
Run Code Online (Sandbox Code Playgroud)
此代码导致错误.更确切地说:
g++ -std=c++0x -Wall -o "enum2" "enum2.cpp" (in directory: /home/aristophanes/Desktop/C++)
Compilation failed.
enum2.cpp:11:15: error: use of enum ‘E’ without previous declaration
enum2.cpp:3:10: error: template parameter ‘class T’
enum2.cpp:12:8: error: redeclared here as ‘int E’
enum2.cpp:16:15: error: use of enum ‘E’ without previous declaration
enum2.cpp:17:14: error: ‘E’ was not declared in this scope
enum2.cpp:17:15: error: template argument 1 is invalid
enum2.cpp:17:18: error: template declaration of ‘bool value’
Run Code Online (Sandbox Code Playgroud)
任何人都可以向我解释我犯了什么错误吗?这是我的还是编译器的错?提前致谢.
编辑:如果完全错误,那我该如何纠正呢?
注意:我正在使用g++ -o <file> <file>.cpp
bam*_*s53 15
实现这一点的最好方法是使用编译魔术,我相信大多数实现都是这样做的.
例如,这里是libc ++对gcc> = 4.3的实现以及任何1的编译器__has_feature(is_enum)
template <class _Tp> struct _LIBCPP_VISIBLE is_enum
: public integral_constant<bool, __is_enum(_Tp)> {};
Run Code Online (Sandbox Code Playgroud)
对于所有其他编译器,libc ++可以:
template <class _Tp> struct _LIBCPP_VISIBLE is_enum
: public integral_constant<bool, !is_void<_Tp>::value &&
!is_integral<_Tp>::value &&
!is_floating_point<_Tp>::value &&
!is_array<_Tp>::value &&
!is_pointer<_Tp>::value &&
!is_reference<_Tp>::value &&
!is_member_pointer<_Tp>::value &&
!is_union<_Tp>::value &&
!is_class<_Tp>::value &&
!is_function<_Tp>::value > {};
Run Code Online (Sandbox Code Playgroud)
其他一些类型的特性仍然需要编译魔术.2例如is_union.但是,可以重写该条件,使其不需要编译魔术.正如Johannes Schaub所指出的那样,这可以通过用单一检查取代对联合和类的单独检查来完成.
__has_feature不幸的是,据我所知只有clang工具.
2.有趣的是,libc ++确实有一个版本is_union<T>并且is_class<T>不使用编译器内在函数,但结果它们为联合类型提供了错误的结果.但是他们的错误结果是互补的,因此libc ++的后备实现is_enum<T>提供了准确的结果.
这个
template<enum E>
Run Code Online (Sandbox Code Playgroud)
承诺模板参数是类型的值enum E.参数不是类型(类型模板参数由以下引入typename,或为了向后兼容,class甚至struct不允许).这就像说
template<int i>
Run Code Online (Sandbox Code Playgroud)
除了没有给变量命名.
事情出了问题.
| 归档时间: |
|
| 查看次数: |
4119 次 |
| 最近记录: |