2

文字列型または文字型を除外する解析関数を作成したい

template <typename T>
bool parse(T & value, const string & token){
    istringstream sin(token);
    T t;
    if( !(sin >>t) )  return false;
    char junk;
    if( sin >>junk )  return false;
    value = t;
    return true;
}

これどうやってするの?

4

3 に答える 3

3

意味に応じて、タイプまたはを除外しますstringchar。リンクしないようにする場合は、タイプの特殊化を宣言することはできますが、定義することはできません。

template <>
void parse<std::string>( std::string & value, const std::string& token );

コンパイラーは特殊化を認識し、コードを生成しません。シンボルがどの変換ユニットでも定義されていないため、リンカは失敗します。

2番目のアプローチは、もう少し複雑ですが、リンク時に失敗するのではなく、コンパイラーがこれらのタイプのテンプレートを受け入れないようにすることです。これは、C ++ 11でより単純なSFINAEを使用して実行できますが、C ++ 03ソリュ​​ーションが必要な場合は、グーグルで検索するか、コメントを追加できます。

template <typename T, 
          typename = typename std::enable_if<!std::is_same<T,std::string>
                                          && !std::is_same<T,char>>::type >
void parse( T & t, const std::string& token ) {
// ...
}

(私はこれをコンパイラーで実行していないので、構文が少しずれている可能性があります。それで遊んでください)コンパイラーはテンプレートを認識し、型の置換を実行しようとすると、に解決されないTために失敗します。std::enable_if<...>::typeタイプ。

一般に、おそらく必要なのは、の特定のバージョンを実行し、parse優先するさまざまなオーバーロードを提供することです。

void parse( std::string& v, const std::string& token ) {
    v = token;
}

これはテンプレートではなく、通常の関数であることに注意してください。テンプレート化されていない関数は、呼び出しの引数が完全に一致する場合、テンプレート化された関数よりも適切に一致します。

于 2012-10-09T02:06:37.863 に答える
0

ブーストタイプの特性を使用できます。is_sameと呼ばれる型比較チェックがあります

http://www.boost.org/doc/libs/1_51_0/libs/type_traits/doc/html/boost_typetraits/reference/is_same.html

charやstringとの比較結果をそのまま使用できます。

于 2012-10-09T02:05:58.217 に答える
0

テンプレートは、DavidRodríguezのメソッドで次のように宣言する必要があります(戻り型を持つ関数の場合)。

template <template T, typename std::enable_if<!std::is_same<T,std::string>::value>::type* = nullptr >
T func(T x){}

複数の条件の場合:

template <template T, typename std::enable_if<!std::is_same<T,std::string>::value &&!std::is_same<T,int>::value>::type* = nullptr >
T func(T x){}

リターンタイプのない関数の場合:

template <template T>
typename std::enable_if<!std::is_same<T,std::string>::value>::type
func(T x){}

複数の条件の場合:

template <template T>
typename std::enable_if<!std::is_same<T,std::string>::value &&!std::is_same<T,int>::value>::type
func(T x){}

含めることを忘れないでください#include <type_traits>

于 2015-03-09T01:21:48.423 に答える