【发布时间】:2012-08-14 09:34:48
【问题描述】:
我正在寻找在编译时了解std::iterator_traits<T>::value_type 是否有效且已定义的解决方案。这样做的问题是 std 库将 value_type 的声明转发到 T 中的派生类型:
typedef T::value_type value_type;
我需要在编译时知道 T::value_type 是否是有效类型以避免与 value_type 不存在相关的错误。
请考虑以下示例:
std::iterator_traits<int *>::value_type; // OK - should return that value_type exists as it's defined in specialization of std::iterator_traits
std::iterator_traits<const int *>::value_type; // OK - should return that value_type exists as it's defined in specialization of std::iterator_traits
std::iterator_traits<std::vector<int>::const_iterator> >::value_type; // OK - the value_type exists defined within std::vector<int>::const_iterator
std::iterator_traits<int>::value_type; // ERROR - the value_type is not defined within int class - this is what I'm trying to avoid to resolve the value_type of.
我需要该解决方案完全符合 C++ 标准和标准库标准并且独立于编译器。
【问题讨论】:
-
我最近回答的这个问题可能会有所帮助:stackoverflow.com/questions/11898657/…
-
@R.MartinhoFernandes:事实上,这看起来像是复制品。
-
我认为整个问题在于它返回 iterator_category 存在: typedef typename _Iter::iterator_category iterator_category;在 std::iterator_traits
默认定义。您的 sfinae 将返回它存在,即问题。 -
@PavelCelba 你试过了吗?除非
_Iter::iterator_category存在,否则std::iterator_traits<T>::iterator_category会导致替换失败(value_type也是如此)。 -
是的,它不会导致替换失败,因为 std::iterator_traits
::iterator_category 是 typedef。编译器不会尝试查看 typedef 是否正确并且会接受替换。