0

以下のように、2 つのテンプレート タイプ T を受け取るテンプレート クラスがあります。

Foo( T arg1,T arg2) 
{

}

このクラスにはT、反復子として使用する関数があります。この関数は、整数型の反復子に対しては問題なく機能しますが、std::string 型の反復子に対しては別の方法で実装する必要があります。

私はすべきです:
最初に整数型のためだけに最初の関数を有効にし、次に
std::string 型のイテレータ用に関数を特殊化します

どうすればいいですか?

4

1 に答える 1

1

「タイプの反復子」と言うの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;
}

これは反復子でのみ機能することに注意してください(通常のポインターにはないTpublic typedef が必要です)。value_type

ただし、明確なユースケースを提供していないため、これがあなたの望むものであるとしか思えません。

ポインターを操作する必要がある場合 (ポインターは技術的にイテレーターであるため)、std::is_pointer と std::remove_pointer を使用できますが、それは読者の演習として残します。

于 2013-10-19T12:47:45.783 に答える