「タイプの反復子」と言うのstd::string
はあまり明確ではありません。std::string::iterator または std::iterator< std::string > のいずれかを意味します。「整数型のイテレータ」についても言及しているため、後者を想定しています。この場合、次のようにして目的を達成します。
#include <iostream>
#include <vector>
#include <string>
#include <type_traits>
template< typename T >
void foo( typename std::enable_if< std::is_integral< typename T::value_type >::value, T >::type a, T b )
{
std::cout << "integral iterator\n";
}
template< typename T >
void foo( typename std::enable_if< std::is_same< typename T::value_type, std::string >::value, T >::type a, T b )
{
std::cout << "string iterator\n";
}
int main()
{
std::vector< std::string > vecStr;
std::vector< int > vecInt;
foo( vecStr.begin(), vecStr.end() );
foo( vecInt.begin(), vecInt.end() );
return 0;
}
これは反復子でのみ機能することに注意してください(通常のポインターにはないT
public typedef が必要です)。value_type
ただし、明確なユースケースを提供していないため、これがあなたの望むものであるとしか思えません。
ポインターを操作する必要がある場合 (ポインターは技術的にイテレーターであるため)、std::is_pointer と std::remove_pointer を使用できますが、それは読者の演習として残します。