次の関数定義がある場合。呼び出し時に、a と c だけに値を渡し、b にはデフォルト値を使用したいのですが、この関数をどのように呼び出しますか?
void func(int a=5,int b=2, int c=3)
{
..........
.........
}
次の関数定義がある場合。呼び出し時に、a と c だけに値を渡し、b にはデフォルト値を使用したいのですが、この関数をどのように呼び出しますか?
void func(int a=5,int b=2, int c=3)
{
..........
.........
}
C++ は、次の種類の構文をサポートしていません。
func(1, , 2);
これは、省略した最も右側のパラメータのみがデフォルト値を取ることができることを意味します。
デフォルトのパラメーターを任意の組み合わせで使用できるようにしたい場合は、次の使用を検討できますboost::optional
。
#include <boost/optional.hpp>
#include <iostream>
typedef boost::optional<int> OptionalInt;
typedef boost::optional<int> Default;
void func(OptionalInt a, OptionalInt b, OptionalInt c)
{
if (!a) a = 5;
if (!b) b = 2;
if (!c) c = 3;
std::cout << *a << std::endl;
std::cout << *b << std::endl;
std::cout << *c << std::endl;
}
int main()
{
func(1, Default(), 1);
}
出力:
1
2
1
C++ 11 標準 (N3485) によると: 8.3.6 [dcl.fct.default]
非テンプレート関数の場合、デフォルト引数は、同じスコープ内の関数の後の宣言に追加できます。標準からの例:
ボイド f(int, int)
ボイド f(int, int = 7); //わかった
したがって、既定の引数は、パラメーター リストの右から左に指定する必要があるという規則があります。その前にanda
を指定せずにデフォルト値を指定することはできません:b
c
void func(int a = 10, int b, int c); //ERROR
ただし、次のことを試すことができます。
void func(int a,int b, int c=3); //set default for c at first
void func(int a,int b = 5, int c); //at later declarations, set for b
void func(int a =10, int b, int c);//at even later declarations, set for a
上記を使用すると、次のように関数を呼び出すことができます。
func(20); //call use default value of b and c
func(15,20); //call use default value of c
func(10,20,30); //do not use default value
func(); // use default values for a, b and c
b
とのデフォルト値をc
好きなように同時に使用したり、c
のみを使用したりできますが、パラメータ リストの途中にあるため、only のデフォルト値を使用して呼び出すことはできません。同様に、only のデフォルト値を使用して呼び出すことはfunc
できません. この方法では、宣言を追加するだけで、冗長なコードはありません。ただし、デフォルト値を任意の方法で使用できるように呼び出すことはできません。b
func
a
ここで実際の例を見つけることができますデフォルト引数の例
あなたは単にそのようなことをすることができます
#define DEF 0
void func(int *a, int *b, int *c) {
if (a) *a = 5;
if (b) *b = 2;
if (c) *c = 3;
}
そして、そのように呼び出します:
int x = 9;
int y = 10;
func(&x, DEF, &y);
提案として:ブースト パラメータ
#include <boost/parameter/name.hpp>
#include <boost/parameter/preprocessor.hpp>
BOOST_PARAMETER_NAME(a)
BOOST_PARAMETER_NAME(b)
BOOST_PARAMETER_NAME(c)
BOOST_PARAMETER_FUNCTION((void),
func,
tag,
(optional
(a, *, 5)
(b, *, 2)
(c, *, 3)))
{
}
int main()
{
func(_a = 5, _c = 3);
}
いくつかのオプションがあります。
オプション 1: 辞書のようなオブジェクトを渡す:
struct myParameters {
int a,b,c;
myParameters( ) : a(3), b(4), c(5) {}
}
void myFunction( const myParameters &p ) {
int a = p.a;
int b = p.b;
int c = p.c;
// stuff
}
myParameters t;
t.a = 3;
t.c = 7;
myFunction( myParameters );
オプション 2: さもなければ無意味な値を使用して、デフォルトを示します。
#define DEFAULT -1;
void myFunction( int a = DEFAULT, int b = DEFAULT, int c = DEFAULT ) {
if( a == DEFAULT ) { a = 3; }
if( b == DEFAULT ) { b = 4; }
if( c == DEFAULT ) { c = 5; }
// stuff
}
(もちろん-1
、実際の値として渡すことはできません。INT_MAX
または他のものを使用することもできます)
オプション 3: オーバーロードと列挙型を使用する (面倒になる可能性があります):
enum NoVal {
DEFAULT
};
void myFunction( int a = 3, int b = 4, int c = 5 ) {
// stuff
}
void myFunction( int a = 3, NoVal, int c = 5 ) {
return myFunction( a, 4, c );
}
void myFunction( NoVal, int b = 4, int c = 5 ) {
return myFunction( 3, b, c );
}
void myFunction( NoVal, NoVal, int c = 5 ) {
return myFunction( 3, 4, c );
}
myFunction( 10, DEFAULT, 2 );
オプション 4: パラメーターがより論理的な順序になるように関数を調整します。