我有一个DeviceSettingsManager
看起来像这样的课程:
class DeviceSettingsManager
{
int32_t PropertyA();
void SetPropertyA(int32_t prop);
std::string PropertyB();
void SetPropertyB(std::string prop);
// about 50 properties go here ...
}
我需要根据我拥有的属性字符串来设置属性。没有代码看起来像这样:
// Parse property string ("PropertyA = 100, PropertyB = xyz, ...") to key/value pairs
if (key == "PropertyA")
manager.SetPropertyA(value);
else if (key == "PropertyB")
manager.SetPropertyB(value);
// 50 more properties ...
不是很好,对吧?
第一个想法是将设置器存储在地图中:
setters_[key](value); // where for example key == "PropertyA" and value = 100
但是有一个问题:我不能在地图中存储不同的函子:
typedef boost::function<void(int32_t)> setter_int_t;
typedef boost::function<void(std::string)> setter_string_t;
std::map<std::string, ???> setters_;
当然,我可以有两张地图(forint32_t
和 for std::string
)。但它不能很好地扩展。如果我将被迫添加具有参数类型的新设置器,float
或者double
甚至user_defined_class
我需要更多的地图。
另一种方法是在这种情况下使用boost::any
by 在这种情况下我需要reinterpret_cast
回到boost::function
我需要的状态,因此再次面临问题。
问题是:如何管理此类 PropertyManager 以防止编写数十亿条 if-else 语句?