Как проверить, является ли тип std :: vector :: iterator во время компиляции?

У меня проблема, когда мне нужно определить, является ли данный тип экземпляром известного вложенного типа, такого как std :: vector :: iterator во время компиляции. Я хочу создать свойство типа is_std_vector_iterator :

#include <type_traits>
#include <vector>

template<typename T> struct is_std_vector_iterator : std::false_type {};

template<typename T, typename Allocator>
  struct is_std_vector_iterator<typename std::vector<T,Allocator>::iterator>
    : std::true_type
{};

int main()
{
  return 0;
}

Но я получаю сообщение об ошибке компилятора:

$ g++ -std=c++0x test.cpp 
test.cpp:7: error: template parameters not used in partial specialization:
test.cpp:7: error:         ‘T’
test.cpp:7: error:         ‘Allocator’

Можно ли проверить наличие зависимого типа, например std :: vector :: iterator ?


Вот мотивирующий пример использования такой черты:

template<typename Iterator>
Iterator my_copy(Iterator first, Iterator last, Iterator result, std::true_type)
{
  // iterators are just pointer wrappers; call memcpy
  memcpy(&*result, &*first, sizeof(typename Iterator::value_type) * last - first);
  return result + last - first;
}

template<typename Iterator>
Iterator my_copy(Iterator first, Iterator last, Iterator result, std::false_type)
{
  // use a general copy
  return std::copy(first, last, result);
}

template<typename Iterator>
Iterator my_copy(Iterator first, Iterator last, Iterator result)
{
  // dispatch based on the type of Iterator
  return my_copy(first, last, result, typename is_std_vector_iterator<Iterator1>::type())
}
7
задан Jared Hoberock 12 November 2011 в 00:54
поделиться