2

Visual Studio 2008 C ++ 03アプリケーションがあり、渡された文字列の種類に応じて、単一の関数でさまざまなパラメーターを使用して文字列操作を実行したいと考えています。

たとえば、次のようなファイル名のパス部分を(単純に)見つけたい場合は、次のようにします。

template< typename Elem, typename Traits, typename Alloc >
std::basic_string< Elem, Traits, Alloc > GetFilePath( 
    const std::basic_string< Elem, Traits, Alloc >& filename )
{
    std::basic_string< Elem, Traits, Alloc >::size_type slash = 
        filename.find_last_of( "\\/" ) + 1;
    return filename.substr( 0, slash );
}

wchar_tベースの文字列の場合はL"\\/"、charベースの文字列を使用します"\\/"

そして、呼び出し規約は次のようになります。

std::wstring pathW = GetFilePath( L"/Foo/Bar/Baz.txt" );

std::string pathA = GetFilePath( "/Foo/Bar/Baz.txt" );

この目標のために上記の関数を変更する方法を誰かが提案できますか?(はい、GetFilePath名前をオーバーロードする2つの関数を使用できることに気付きました。可能であれば、それを避けたいと思います。)

4

1 に答える 1

1

パス区切り文字およびその他の関心のあるものの特性クラスを作成します。

template<typename Elem> struct PathTraits { static const Elem *separator; };
template<> const char *PathTraits<char>::separator = "\\/";
template<> const wchar_t *PathTraits<wchar_t>::separator = L"\\/";

次に、関数テンプレートでを使用できますfind_last_of(PathTraits<Elem>::separator)

于 2012-07-31T20:16:43.983 に答える