1

私の雇用主の会社にはAPIパッケージがあり、クラスの特定の関数を使用してQAのテストを作成するように求められます。関数は次のようなものです。

void func(int a, int b, int c, int d, int e);

ここで、bdはデフォルトのパラメータです。タイプは明らかにそうではありませんint、私は目的を理解するためにここでそれらを作成しました。NULL現在、デフォルトの引数を渡すことでその関数を使用できます。しかし、上記の関数の場合、 &funcのデフォルト値がゼロ以外の場合、ユーザーはこれを知らず、使用した場合(= 0)、別の結果が得られると考えていました。bd1NULL

したがって、デフォルト以外の引数の間にデフォルトの引数を持つ関数を作成する方法を知りたいのですが、その引数に何も渡す必要はありません。

func(23, , 34, , 45);

現在、VS2010では、当社のAPI呼び出しの同様の実装でコンパイルエラーが発生しています。

質問をかなり明確に理解できるようにしたいと思います。

他の場所でも同様の質問を検索しようとしましたが、クエリの解決策が見つかりませんでした。

ありがとうございました。

4

5 に答える 5

5

それはできません。オプションではないすべてのパラメーターを最初に配置し、その後にオプションのパラメーターを配置する必要があります。

オプションのパラメータの詳細については、こちらを参照してください。マイクロソフトは次のように述べています。

デフォルトの引数は、後続の引数が省略された関数呼び出しでのみ使用されます — それらは最後の引数でなければなりません。したがって、次のコードは違法です。

int print( double dvalue = 0.0, int prec );
于 2013-03-06T10:36:13.783 に答える
4
void func(int a, int c, int e)
{
    int default_b = 1;
    int default_d = 1;
    func(a, default_b, c, default_d, e);
}

それ以外の場合は、C++ には名前付きパラメーターがないため、単純にできません。

(別の解決策は、boost::bind または同様のファンクターを使用することです)。

元の関数を変更できる場合は、デフォルトのパラメーターが最後にあるという条件で、デフォルト値を使用するだけです。

void func(int a, int c, int e, int b = 1, int d = 1);
于 2013-03-06T10:40:00.017 に答える
2

他のトリプレットではなく、a、c、および e を渡すつもりであることをコンパイラーがどのように認識できると思いますか? 関数宣言では、デフォルト値を持つパラメーターの後のすべてのパラメーターにはデフォルト値が必要です。したがって、デフォルトの b と d を持つことはできません。この関数に 3 つのパラメーターのみを渡す場合は常に、最後の 2 つのパラメーターにデフォルト値を使用する必要があることを意味し、これらは d と e です。オプションのパラメーターを関数の最後に移動します。

于 2013-03-06T10:37:05.167 に答える
0

あなたが探しているものを達成するための直接的な方法はありません。

最初の選択肢はboost::optional<T>、パラメーターに を使用することです。

Boost Parameter Librarynamed parametersに実装されている別の方法もあります。

これがあなたにとって何かあると思われ、ユースケースでこれらをどのように使用できるかについてさらに詳しく知りたい場合は、お知らせください。この回答を編集します。

于 2013-03-06T10:45:33.453 に答える