2016-08-21 2 views
-2

私は多くのリソースを検索したし、彼らが提供する例では、それは次のようになります。デフォルトのパラメータを前のパラメータを繰り返さずに提供するにはどうすればよいですか?

void bar(int a = 4, char b = 'A') 
{ 
} 

this resourceによると、それは次のように呼び出すことができます。

bar(b : 'Z'); 

が、それが与えます私のエラーidentifier "b" is undefined。 私はVisual Studio 2015 Update 3 Enterpriseを使用しています。

2番目のパラメータのみを指定する方法はありますか?

+5

これは提案です –

+0

ところで、この提案はおそらくC++の機能がどのように呼び出されているかの技術に矛盾し、リンク可能なライブラリが存在しないものと互換性がないため実装されませんそこ。 –

+0

いいえ、閉鎖されます – mihkov

答えて

7

あなたがリンクする論文は単なる提案に過ぎません。あなたが使用しようとするメカニズムは、(現在)標準で定義されているC++の一部ではありません。したがって、コンパイラがそれを実装することは期待できません。

現在、他に標準的な回避策はありません。いくつかのパラメータを設定する場合は、その前にあるすべてのパラメータを関数宣言で指定する必要があります。

あなたはBoost Parameterのようなものを使うことができますし、ユーザーコードでその機能をエミュレートするためにあなた自身も同様のものを実装することができます。それが良いアイデアであるかどうかは議論の余地がありますが、あまりに一般的ではないので、他のプログラマーにとって混乱するかもしれません。


¹Thisは、言葉の問題かもしれません:「提案は」誰かが良いでしょうと言うものです、ない状態のものがあります。

0

可能な解決策の1つは、std::bindをその名前空間で定義されたプレースホルダと共に使用することです。例:他の回答で示唆したように

void bar(int a = 4, char b = 'A') { 
} 

using namespace std::placeholders; 
auto f = std::bind(bar, 2, _2); 
f('Z'); // equivalent to bar(2, 'Z'); 

は、std::bind式は関数の宣言から、デフォルトの引数を使用していする方法はありませんが、それは、少なくとも一つだけ、それへの引数の指定ができます。

関連する問題