1

C++ テンプレートを使用して非常に単純なことを達成しようとしています。sgn(x)x がdoubleor std::vector<double>(結果を含む a を返す)の場合を処理できる汎用符号関数を作成したいと思いstd::vector<double>ます。それを達成するために、私はテンプレートを使用しています

double f(double x) {
    return (x>=0)?1.0:-1.0;
};

template<typename T>
T F(T x) {
   // ?
};

fテンプレートをキャストして、 ifdoubleまたはforループ ifを使用したいと思いますstd::vector<double>。残念ながら、私の関数は算術演算子を使用しておらず、条件演算子はオーバーロードできません。どうすればよいですか?

4

2 に答える 2

3

オーバーロードは目的を達成するための最良の方法ですが、実際には C++ 標準ライブラリを操作する方法ではありません。

コンテナーのすべての要素に関数を適用する (それらを変更するか、新しい結果を作成する) 場合は、使用する関数と共にstd::transformor std::for_eachを使用します。

std::vector<double> doubles, results;
std::transform(begin(doubles), end(doubles), std::back_inserter(results), sgn);

これにより、現在のアプローチよりもはるかに優れた懸念が分離されます。本当に必要な場合にのみコンテナ全体を操作し、それ以外の場合はイテレータと高階関数を使用してください。

于 2012-07-10T12:23:34.230 に答える
3

これは、テンプレートではなくオーバーロードによって解決されます。

double sign(double x) {
    return x < 0.0 ? -1.0 :
           x > 0.0 ?  1.0 : 0.0;
};

std::vector<double> sign(std::vector<double> const& x) {
    // ?
};

そうは言っても、sign関数がベクトルにとって意味があるかどうかは疑問です。

ちなみに、これは、質問のタイトルで主張されているように、「算術」関数と「非算術」関数とは何の関係もありません。この区別は C++ にはありません。

于 2012-07-10T12:20:09.740 に答える