如果傳遞給模板的類型是枚舉類型,如何檢查(不使用Boost或其他非標準庫)?
謝謝。檢查類型是枚舉的方法
1
A
回答
2
看着http://www.boost.org/doc/libs/1_44_0/boost/type_traits/is_enum.hpp,
如果返回true
:
::boost::type_traits::ice_or<
::boost::is_arithmetic<T>::value
, ::boost::is_reference<T>::value
, ::boost::is_function<T>::value
, is_class_or_union<T>::value
, is_array<T>::value
>::value
然後在此基礎模板選擇:
// Don't evaluate convertibility to int_convertible unless the type
// is non-arithmetic. This suppresses warnings with GCC.
template <bool is_typename_arithmetic_or_reference = true>
struct is_enum_helper
{
template <typename T> struct type
{
BOOST_STATIC_CONSTANT(bool, value = false);
};
};
否則,檢查它是否轉換爲int
:
template <>
struct is_enum_helper<false>
{
template <typename T> struct type
: ::boost::is_convertible<typename boost::add_reference<T>::type,::boost::detail::int_convertible>
{
};
};
如果你想和Boost一樣做,你必須定義所有這些特性。 <type_traits>
就是這樣。
2
我很欣賞你想總的便攜性和不使用升壓。如果您發現不切實際,您可能更願意使用簡單的ifdef和以下內容: MSDN在c++ is_enum
的谷歌搜索結果的首頁上有類似的功能。 在最近的GNU編譯器上,儘量使用using std::tr1::is_enum;
即使你不想使用boost,你也可以檢查它用於確定的技術。看起來很複雜,可排除所有其他可能性: - /。
相關問題
- 1. 枚舉類型檢查
- 2. 檢查枚舉類型是ulong
- 3. 檢查什麼類型的枚舉進入通用方法
- 4. 檢查枚舉類
- 5. 枚舉類型檢查編譯器?
- 6. 枚舉拋出「不是枚舉類型」
- 7. 檢索枚舉int類型
- 8. 枚舉類型中的等於方法
- 9. 有什麼辦法可以檢查一個類型是枚舉類型嗎?
- 10. 檢查枚舉
- 11. 檢查枚舉
- 12. 類型枚舉
- 13. 子類檢查,是運算符還是枚舉檢查
- 14. Ç枚舉(枚舉類型定義)的
- 15. Node.js native枚舉中的枚舉類型
- 16. Ada:如何檢查輸入是否枚舉類型
- 17. 如何檢查一個實例是否爲枚舉類型
- 18. 檢索Z3Py中枚舉類型的值
- 19. 檢查FileAttributes枚舉
- 20. 枚舉vs強類型枚舉
- 21. 如何在Razor中針對枚舉類型進行枚舉值檢查
- 22. 是枚舉實例「封閉」在枚舉類型的Java?
- 23. 上枚舉類型
- 24. HTML5枚舉類型
- 25. 爲枚舉類型
- 26. 枚舉或類型
- 27. psycopg2枚舉類型
- 28. 具有泛型類型的泛型枚舉枚舉
- 29. 枚舉與功能的方法(組合類/枚舉)
- 30. 如何檢查Delphi中枚舉的IStorage元素的類型?
@Tony我更新了我的問題 – 2010-09-15 19:17:06
其實,is_enum應該小心使用。一些編譯器不正確地支持它。查看最新版本的boost:http://www.boost.org/doc/libs/1_44_0/libs/type_traits/doc/html/boost_typetraits/reference/is_enum.html – 2010-09-15 19:18:19
@Cătălin:「在Borland C++ Builder 5下破解,而對於版本8之前的Metrowerks編譯器「不太可能打擾太多人(可憐的老Borland)。 – 2010-09-15 19:23:25