Giả sử tôi có một std::any
đối tượng có thể có hoặc không chứa con trỏ tới một lớp dẫn xuất của một lớp cơ sở nhất định B
. Có cách nào tôi có thể làm một cái gì đó:
- Trả về a
B *
, nếustd::any
đối tượng giữ một cái gì đó có thể chuyển đổi thànhB *
, hoặc - Ném một ngoại lệ nếu không?
Có vẻ như dynamic_cast
và std::any_cast
mỗi cái cung cấp một nửa chức năng này, nhưng tôi không thấy bất kỳ cách nào để kết hợp cả hai.
Tôi biết rằng tôi có thể thực hiện công việc này theo nhiều cách khác nhau liên quan đến việc liệt kê rõ ràng mọi loại chuyển đổi thành B *
, nhưng đó là mẹ của tất cả các vi phạm DRY.
Trường hợp sử dụng mẫu:
std::vector<std::any> setupTools(const std::string & confFile)
{
std::vector<std::any> myTools;
auto conf = parse(confFile);
for(std::string & wrenchInfo : conf["Wrenches"])
{
Wrench::setup(myTools, wrenchInfo);
}
for(std::string & hammerInfo : conf["Hammers"])
{
Hammer::setup(myTools, hammerInfo);
}
// 25 more kinds of tools
}
Factory1::init(const std::vector<std::any> & tools)
{
m_wrench = any_get<Wrench *>(tools);
m_hammer = any_get<Hammer *>(tools);
m_saw = any_get<Saw *>(tools);
}
Factory2::init(const std::vector<std::any> & tools)
{
m_wrench = any_get<TorqueWrench *>(tools);
}
Factory3::init(const std::vector<std::any> & tools)
{
m_saw = any_get<CordlessReciprocatingSaw *>(tools);
}
Tôi không muốn bao gồm một loạt mã soạn sẵn liệt kê từng loại cưa duy nhất để tôi có thể lấy một cái cưa - bất kỳ Saw
- để sử dụng Factory1
.
B*
s vào std::any
đối tượng và không dẫn xuất con trỏ lớp, thì điều đó sẽ giải quyết vấn đề khá dễ dàng.
myTools
đều là công cụ tại sao không chỉ có một Tool
lớp cơ sở và tạo myTools
một std::vector<std::unique_ptr<Tool>>
?
myTools
tồn tại; Tại sao bạn muốn đặt những gì bạn tuyên bố là những đối tượng hoàn toàn khác nhau vào nó, sau đó lặp đi lặp lại chúng để cố nhớ những gì bạn đặt ở đó?
std::any
cho việc này, và những gì bạn đang cố gắng giải quyết tổng thể? Điều này có vẻ như là một vấn đề rất khó xử và có lẽ có một cách tốt hơn xung quanh nó