我试图找到一个优雅的方式来声明一个启动函数,它使用当前存储在我的对象(非静态值)中的默认值。我基本上喜欢做这样的事情。多个非静态默认参数C++
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之前的缺点功能。它还会强制某人检查该类以检查方法的实现,以了解将使用成员默认值而不是空值。
我敢肯定有一种方法,图案或东西,使这个正确的,但我还没有找到它:(
感谢您帮助!
这是一个严格的pre-C++ 11问题吗? –
哦,我还没有用过C++ 11,而且自从修改了pre-C++ 11以后,我会说找到一种方法可以在不使用C++ 11特性的情况下进行更改。我会阅读这个功能,如何,thx! –
有这样做的方法,你猜,我可能会倾向于最基本的版本,你有一个简单的标题条目'void initSomething(string defaultName = NULL,vector defaultUrls = NULL,map defaultParams = NULL)'并在cpp文件中有一些逻辑来处理存在的参数。不优雅,但简单而有效。 –
GMasucci