У меня проблема, когда мне нужно определить, является ли данный тип экземпляром известного вложенного типа, такого как 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
?
Вот мотивирующий пример использования такой черты:
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())
}