我有五个不同的结构可以根据“类型”变量创建。我有很多代码行依赖于此“临时”对象存在(大约有50行代码将变量加载到结构中)。
当前,下面列出的代码不起作用,因为temp被限制在if语句的本地范围内,因此它不在它的外部。
我不能简单地在顶部实例化一个通用端口,因为每个端口都有不同的特性。
很明显,我可以将所有成员分配代码都包含在if语句中,但这是令人难以置信的混乱和笨拙。
是否有一种方法可以为每种端口类型分配适当的变量,而无需大量重组我的代码?
class Abc
{
cv::VideoCapture cap;
Abc(){
cap.open(0);
}
void frameDetails(int width = 640,int height =480){
cap.set(CV_CAP_PROP_FRAME_WIDTH,width);
cap.set(CV_CAP_PROP_FRAME_HEIGHT,height);
}
};
int main(int argc, char **argv){
Abc obj();
return 0;
}
答案 0 :(得分:2)
通常要做的是拥有一个共享的基类:
struct portCommon {
std::string foo;
std::string bar;
std::string bash.
};
struct portFc : public portCommon {
};
...etc
和工厂地图。
const std::map<std::string, std::function<std::unique_ptr<portCommon>>> factories = {
{"FC", [](){return std::make_unique<portFc>();}},
{"SAS", [](){return std::make_unique<portSas>();}},
{"PCIe", [](){return std::make_unique<portPcie>();}},
{"iSCSI", [](){return std::make_unique<portIscsi>();}},
{"IPREP", [](){return std::make_unique<portIprep>();}}
};
使用辅助方法:
std::unique_ptr<portCommon> createPort(const std::string& type) {
auto iter = factories.find(type);
if (iter != factories.end()) {
return iter->second();
} else {
return std::make_unique<portGeneric>();
}
}
然后代码更简单:
std::string id;
std::string type;
inputStream >> id;
inputStream >> type;
std::unique_ptr<portCommon> temp = createPort(type);
inputStream >> temp->foo;
inputStream >> temp->bar;
inputStream >> temp->bash;
.
.
.
inputStream >> temp->final;
答案 1 :(得分:1)
有一种相对简单的方法可以使用C ++ 14中引入的通用lambda。该函数的工作方式几乎与您的工作方式相同,除了我们需要定义包含{<1>}一系列语句之前的其余函数的lambda(因为它需要当您调用它时会出现在作用域中)。
if