1

次の関数があるとすると、それが生成する値は、コード内の他の多くの関数で必要になります。

float mean(foo param1, bar param2);

私の他の関数は次のようになります。

float foobar(foo param1, bar param2, float meanValue);

私がやりたいことは次のとおりです。

float foobar(foo param1, bar param2, float meanValue = mean(param1, param2));

関数をデフォルトのパラメーターとして渡すことは有効ですが、コンパイラー(VS2008)は、パラメーターがmeanValueで始まり、右から左にスタックにプッシュされるため、param1param2が宣言されていないと文句を言います。もちろん、パラメータの順序を逆にすることはできません。その場合、最初のパラメータのデフォルト値を指定できないためです。

平均値に-10000のような値を渡して、mean()関数を呼び出すように自分に指示することができます。または、すべての関数をオーバーロードすることもできます(そして、オーバーロードするのに10以上あります)が、それはあまりきれいではありません。関数をデフォルトのパラメーターとして呼び出すことができるのは本当に素晴らしいことだと思います。私がやろうとしていることを達成するためのきちんとした方法があるかどうか疑問に思っています。

4

1 に答える 1

3

パラメーターがスタックにプッシュされる順序、パラメーターがまったくプッシュされるかどうか、またはアーキテクチャーにスタックが存在するかどうかは、C++標準では指定されていません。

なぜそのような関数がたくさんあるのか、そしてそれらがどのように異なるのかについてはあまり情報を提供しませんが、おそらく次のことがオーバーロードの数を減らすのに役立つでしょう:

template< typename T1, typename T2 >
float foobar(T1 param1, T2 param2)
{
    return foobar(param1, param2, mean(param1, param2));
}

mean()必要に応じて、結果の型と呼び出される関数、および関数のすべてのテンプレートパラメータを作成できることに注意してください。

于 2012-01-04T19:40:29.050 に答える