2016-09-08 32 views
1

私はここでいくつか答えを見ましたが、ここでは適用できません。多分タイプstringの四番目の引数、何かに基づいて、私はオプションであることをyzのために希望C++関数のstd :: vector引数(省略可能)

const std::complex<double> Class::func(const std::complex<double> &x, \ 
             std::vector<double> &y = 0, \ 
             std::vector<double> &z = 0) const; 

:私は主に一つだけの引数(1)で使用されている(メンバー)機能を持っていますfunc( , , , const std::string &choice)のようなものですが、関数に引数を1つだけ渡し、残りの2つは使用しません。たとえば、yを渡した場合、その宣言はfunc()の前に実行しなければならないでしょう。zと同じですが、これはオプションにしたいと思います。関数は数学的に重いものにする必要はありません必要でない場合は2つの追加ベクトルを計算する負担をかけることができます。これは可能ですか?

+0

を'std :: optional'があります。さもなければ 'boost :: optional'があります。 – NathanOliver

+0

参照の代わりにポインタを渡し、デフォルト値をnullptrに設定します。次に、あなたのコードにy!= nullptrとz!= nullptrが入っているかどうかをチェックすれば完了です。小さな警告では、デフォルト値を持たない限りパラメータを持つことができません(文字列にはデフォルト値があるはずですが、小さな型を使用して重くすることはできません)。 –

+0

関数内からyまたはzを変更する必要がありますか?言い換えれば、yとzは 'const std :: vector &z' – log0

答えて

4

使用ポインタと何をするか、

+0

これにはある種のメモリ管理が必要でしょうか? 'delete []'または同様のものと同様? –

+0

'new'もなければ、どこかに' delete'するものはありません。あなたはあなたが '新しくしたものだけ'を削除することができます。 –

+0

この関数をfunc 'func(vec1、&vec2、&vec3)'と呼びます。vec2とvec3はローカル変数ではありません。あなたが 'new 'でそれらを割り当てる場合のみ – Hayt

1

しかしstd::vectorの使用を考えると...私はここでそれらをデフォルトとしましたが、それはオプションだnullptr、これをチェック..

const std::complex<double> Class::func(const std::complex<double> &x, \ 
             std::vector<double> *y = nullptr, \ 
             std::vector<double> *z = nullptr) const; 

を渡します「空」vectorは?これはあなたが必要とする「オプションの」値として使用できます。

元のコードの注釈。 「null」参照は無効です。つまり、std::vector<double> &y = 0はコンパイルされません。ポインタをその場所で使用することができますが、すぐに割り当てが必要であるとは限りません。

const std::complex<double> Class::func(
    const std::complex<double> &x, 
    std::vector<double>* y = nullptr, 
    std::vector<double>* z = nullptr) const; 

機能オーバーロードは、このような状況ではよくある回答です。またstd::optionalあり

const std::complex<double> Class::func(
    const std::complex<double> &x) const; 
const std::complex<double> Class::func(
    const std::complex<double> &x, 
    std::vector<double>& y) const; 
const std::complex<double> Class::func(
    const std::complex<double> &x, 
    std::vector<double>& y, 
    std::vector<double>& z) const; 

機能の内部は...最終的な実装のためのそれぞれに延期されています。

const std::complex<double> Class::func(
    const std::complex<double> &x, 
    std::optional<std::vector<double>> &y, 
    std::optional<std::vector<double>> &z) const; 

標準ライブラリで利用できない場合は、boost::optionalもあります。

+0

この 'std :: optional'への参照に変換される' std :: vector & '、ここでの意図した使用法を渡すでしょうか?私はそう信じていない。 –

+0

これは、呼び出し元と、それらがどのように 'ベクトル 'を生成するかに依存します。それが適切な場所に( 'optional'の中で)作成された場合、同様のセマンティクスが維持されます。オプションの外に作成した場合は、コピーが作成されます。 – Niall

+0

これは機能するでしょうか?非const参照を一時的に渡しています。たぶん、オプション_の代わりに_オプションのリファレンス_? –

1

参照はオプションにすることはできませんが、あなたがあなたの代わりにポインタを使用し、デフォルトとしてnullptr使用する必要があり、コピー操作に不安がある場合boost::optional<>

と呼ばれるものがあります。

あなたはまた、最後に文字列に依存させたい場合は、ラッパー関数を書くことができ

ちょうど別の関数を追加:あなたはあなたのコンパイラはすでにそれを持って待つことができればまあ

const std::complex<double> Class::func(
    const std::complex<double> &x, 
    std::string str, 
    std::vector<double> *y = nullptr, 
    std::vector<double> *z = nullptr) const 
{ 
    if(str == ...) 
     return func(....); 
    else 
     return func(....); //different call 
} 
+1

*あるいはデフォルトでemtpyベクトルを使うことができます... y = {} ... *は 'const&'でしか動作せず、OPはオプションのベクトルを変更する必要があります。 – NathanOliver

+0

ああ、それを見ませんでした。私はその部分を取り除いた。 – Hayt

関連する問題