Моя задача — определить класс спецификации устройства, который состоит из различного количества свойств. Например, спецификация Устройство1 содержит Свойство1, Свойство2. Некоторые другие Device2 содержат только Property1, спецификация DeviceX содержит Property5, Property6 и т. д.
Чтобы избежать повторения подобных реализаций для этих методов setProperty, я решил хранить их в отдельных классах и выводить из них кучу спецификаций.
Существует множество очень похожих классов, содержащих специализированные методы, использующие идиому CRTP. CRTP используется для доступа к методу setParameter класса SPECIFICATION:
template<typename SPECIFICATION>
struct Property1
{
void setProperty1( const double & Value)
{
static_cast<SPECIFICATION*>(this)->setParameter( "Property1", Value);
}
};
template<typename SPECIFICATION>
struct Property2
{
void setProperty2( const double & Value)
{
static_cast<SPECIFICATION*>(this)->setParameter( "Property2", Value);
}
};
Эти шаблонные классы затем используются в отношении идиомы CRTP:
template<typename DEVICE_TYPE>
class Device
{
public:
class Specification;
};
template<>
class Device<DeviceTypeAAA>::Specification
: public Property1<Specification>,
public Property2<Specification>
{
};
template<>
class Device<DeviceTypeBBB>::Specification
: public Property1<Specification>
{
};
template<>
class Device<DeviceTypeCCC>::Specification
: public Property2<Specification>
{
};
Как видно из приведенного выше фрагмента кода, спецификация устройства «собирается» с использованием наследования требуемых свойств. Все устройства являются специализированными классами Device::Specification.
ВОПРОС: Поскольку существует действительно много «классов свойств», реализующих методы «setProperty», и довольно много классов спецификаций устройств, мне любопытно узнать, существует ли какой-нибудь элегантный метод, как реализовать эту группу похожих классов более эффективным кодом. Я думал об использовании boost::mpl::vector в сотрудничестве с линейным наследованием boost, чтобы определить список всех свойств, которые должно получить устройство... Может быть, я следую совершенно неправильному направлению, реализуя это. Пожалуйста, дайте мне знать, если вы так думаете.
Если есть идеи как оптимизировать реализацию, буду очень рад. Большое спасибо всем, кто готов помочь!