c++中如何跳过默认参数
how to skip Default Arguments C++?
我必须用两个默认参数编写构造函数。
func(int arg1 , char* arg2 = "arg2", int arg3 = 1) //example
我提供了一个场景,其中构造函数被调用,并给arg1
和arg2
一个值,arg3
预计使用默认值。然后实例化另一个对象,并给arg1
和arg3
一个值,并期望使用arg2
的默认值。现在的问题是,你"不能跳过"默认参数是我从文本和在线阅读。它的意思是根据它被重载的可能性对默认参数进行排序,但是这个场景使用了一个默认参数,而另一个没有。这个问题的提示告诉我重新排序参数/参数。然而,无论我做了多少次重新排序,似乎都无法解决这个问题。
也不能使用重载构造函数。这必须由一个构造函数完成。
那么怎么做呢?我被这个难住了,有点疯狂:
也不能使用重载构造函数。这必须由一个构造函数完成。
对于这个要求,我能想到的唯一原因是可选参数具有相同的类型。在这种情况下,您就卡住了,您需要查看命名构造函数和/或命名参数的习惯用法。
否则,只需定义额外的构造函数。这可能涉及到一些重复。默认值
Foo(int arg1 , char const *arg2 = "arg2", int arg3 = 1)
{
construct(arg1, arg2, arg3);
}
Foo(int arg1, int arg3)
{
construct(arg1, "arg2", arg3);
}
特殊限制,只能有一个构造函数。这是我能想到的最接近的:
#include <iostream>
// cheap and cheerful Boost.Variant
struct StringOrInt {
char *s;
int i;
bool is_string;
StringOrInt(char *s) : s(s), i(0), is_string(true) {}
StringOrInt(int i) : s(0), i(i), is_string(false) {}
bool isInt() { return !is_string; }
int asInt() { return i; }
char *asString() { return s; }
};
struct Foo {
int m1;
char *m2;
int m3;
Foo(int arg1, StringOrInt arg2 = "arg2", int arg3 = 1) : m1(arg1) {
if (arg2.isInt()) {
arg3 = arg2.asInt();
arg2 = "arg2";
}
m2 = arg2.asString();
m3 = arg3;
}
void print() {
std::cout << m1 << " " << m2 << " " << m3 << "n";
}
};
int main() {
Foo(1, "HelloWorld").print();
Foo(1, 2).print();
}
注意,在GCC中,这会产生警告,因为从字符串文字到非常量char*
的转换是不赞成和不明智的。但这是你所要求的,并且修复它,使char*
参数和数据成员是const char*
是很容易的。
一个明显的缺点是,这并不能阻止您编写Foo(1,2,3)
。要在编译时检查这一点,我认为你需要多个构造函数。要在运行时检查它,可以将第三个参数设置为另一个类DefaultOrInt
,其中Default
是专门用于此目的的类型,只支持一个值作为arg3
的默认值。如果arg2.isInt()
为真,则检查arg3.isInt()
为假,否则抛出logic_error
。
如果允许在第二个参数没有值时传递一个空的C-string,则可以使用辅助函函数来检查arg2
并在其为空时返回默认值。像这样:
#define DEFAULT_ARG "arg2"
struct helper_class {
char* operator()(char* arg)
{
if (*arg) return arg; else return DEFAULT_ARG;
}
} helper;
class func {
public:
func(int arg1 , char* arg2 = "arg2", int arg3 = 1) {}
};
int main()
{
func f1(42, helper(""), 9001); // default 2nd argument
func f2(42, helper("Its over 9000!"));
}
现在您可以使用std::bind来完成这种操作,或者在c++14/17中您可以使用lambda函数来完成相同的操作。
- 如何使用默认参数等选择模板专业化
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 何时提供默认参数作为模板参数
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 如何修复带有 clang 的参数'args'缺少默认参数的问题?
- 函数不接受 X 参数,函数使用默认参数
- initializer_list具有默认参数的构造函数
- C++ 带有默认参数的结构,可选择在构造函数中更改
- 为什么C++构造函数在继承中需要默认参数?
- 必须非常量别名参数及其默认参数常量
- C++ 默认参数使用其他参数
- 组合函数参数包和默认参数
- 如何定义 Vector2f 的默认参数?[SFML]
- 有条件地将默认参数传递给函数(使用"?"运算符)
- 使用具有默认参数的函数模板进行 decltype 会使结果混乱(一个有趣的问题或 gcc 的错误)
- 如何设置默认参数以防用户不输入另一个参数
- 结构 c++ 中的默认参数
- 构造函数委托与默认参数
- 默认参数和函数指针作为函数参数C++
- 如何在继承层次结构中调用具有默认参数的构造函数?