Один метод, который работает, по крайней мере, на gcc, - это ссылка typedef:
struct true_type { };
struct false_type { };
template<typename T>
struct is_const_reference
{
typedef false_type type;
};
template<typename T>
struct is_const_reference<T const &>
{
typedef true_type type;
};
template<typename T>
struct is_const_iterator
{
typedef typename is_const_reference<
typename std::iterator_traits<T>::reference>::type type;
};
. Чтобы проверить, работает ли он, используйте
inline bool test_internal(true_type)
{
return true;
}
inline bool test_internal(false_type)
{
return false;
}
template<typename T>
bool test(T const &)
{
return test_internal(typename is_const_iterator<T>::type());
}
bool this_should_return_false(void)
{
std::list<int> l;
return test(l.begin());
}
bool this_should_return_true(void)
{
std::list<int> const l;
return test(l.begin());
}
.При достаточно высоком уровне оптимизации последние две функции должны быть уменьшены до return false;
и return true;
соответственно.По крайней мере, они делают для меня.