我试图找到一种优雅的方式来声明一个使用当前存储在我的对象中的默认值(非静态值)的启动函数。我基本上想做这样的事情。
class A{
A([...],
string defaultName,
vector<string> defaultUrls,
map<string, string> defaultParams);
[...]
void initSomething(string defaultName = mDefaultName,
vector<string> defaultUrls = mDefaultUrls ,
map<string, string> defaultParams =mDefaultParams);
private:
string mDefaultName;
vector<string> mDefaultUrls;
map<string, string> mDefaultParams;
[...]
}
我知道我可以重载这个initSomething()
函数,但我会得到这样的东西:
void initSomething(){
initSomething(mDefaultName, mDefaultUrls, mDefaultParams);
}
void initSomething(string defaultName){
initSomething(defaultName, mDefaultUrls, mDefaultParams);
}
void initSomething(vector<string> defaultUrls = mDefaultUrls){
initSomething(mDefaultName, mDefaultUrls, mDefaultParams);
}
void initSomething(map<string, string> defaultParams){
initSomething(mDefaultName, mDefaultUrls, defaultParams);
}
void initSomething(string defaultName, vector<string> defaultUrls){
initSomething(mDefaultName, mDefaultUrls, mDefaultParams);
}
void initSomething(string defaultName, map<string, string> defaultParams){
initSomething(defaultName, mDefaultUrls, defaultParams);
}
void initSomething(vector<string> defaultUrls, map<string, string> defaultParams){
initSomething(mDefaultName, defaultUrls, defaultParams);
}
void initSomething(string defaultName,
vector<string> defaultUrls,
map<string, string> defaultParams);
它非常丑陋而且如此庞大,以至于整个头文件更难阅读和理解它的含义。
我还想了点别的:
void initSomething(string defaultName = "",
vector<string> defaultUrls = vector<string>(),
map<string, string> defaultParams = map<string, string>()){
if (defaultName == "") {
defaultName = mDefaultName;
}
if (defaultUrls.empty()) {
defaultUrls = mDefaultUrls;
}
if (defaultParams.empty()) {
defaultParams = mDefaultParams;
}
[...]
}
如果在调用 initSomething 函数之前成员变量未设置为空,它仍然很丑陋,并且具有不让这些值之一真正为“空”的缺点。它还强制检查类的人检查方法的实现,以了解将使用成员默认值而不是空值。
我确定有一种方法、一种模式或其他东西可以使这件事变得正确,但我还没有找到它:(
谢谢你的帮助!