6

std :: stoi、std :: stof、std :: stodなどのジェネリック関数を作成したいのですが、次のようになります。

// std::string -> int
std::string str = "1000000";
int i = to_numeric<int>(str);

// std::string -> long
std::string str = "100000000000";
long i = to_numeric<long>(str);

// std::string -> float
std::string str = "10000.1";
float i = to_numeric<float>(str);

しかし、部分的な特殊化を行う方法がわかりません。

template<class T>
int to_numeric(const std::string &str, size_t *pos = 0, int base = 10) {
    return std::stol(str, pos, base);
};

template<>
long to_numeric<long>(const std::string &str, size_t *pos, base) {
    return std::stol(str, pos, base);
};

template<>
float to_numeric<float>(const std::string &str, size_t *pos) {
    return std::stof(str, pos);
};
// .....

エラー:

to_numeric.cpp:76:79: error: default argument specified in explicit specialization [-fpermissive]
to_numeric.cpp:76:12: error: template-id 'to_numeric<float>' for 'float to_numeric(const string&, size_t*)' does not match any template declaration
make: *** [build] Error 1
4

2 に答える 2

2

3つの引数(、、、および)をとるプライマリテンプレートを指定しますが、str1posbaseの引数だけをとる関数テンプレートでそれを特殊化しようとします。明らかに、これは機能しません。スペシャライゼーションはプライマリテンプレートと一致する必要があります。

関数テンプレートの部分的な特殊化は[まだ?]サポートされていません。部分的に特殊化された関数テンプレートが必要な場合は、部分的に特殊化する必要があります。クラステンプレートに委任し、部分的に特殊化する必要があります。クラステンプレートには、static関数が1つしかない場合があります。もちろん、あなたの例では、部分的な特殊化ではなく、完全な特殊化を使用しています。

于 2012-11-04T18:56:37.903 に答える
2

まず、特殊化されていないテンプレート関数を完全にテンプレート化する必要があります。つまり、リターンタイプを作成する必要がありますT。また、この特殊化されていない関数は、戻り値以外のことは何もしないことをお勧めしますT()(特殊化されておらず、呼び出す関数がわからないため)。

続行するには、特殊化は非特殊化関数と同じto_numeric<float>引数を持つ必要があるため、ダミー引数を追加する必要があります。base

于 2012-11-04T18:57:04.687 に答える