Лучший способ использования именованного параметра C ++?

Я разрабатывал библиотеку графического интерфейса для Windows (как личный сторонний проект, без стремлений к полезности). Для моего класса главного окна я установил иерархию классов опций (используяИдиома Именованного Параметра), поскольку некоторые параметры являются общими, а другие относятся к конкретным типам окон (например, к диалоговым окнам).

Как работает именованный идиоматический параметр, функции класса параметров должны возвращать объект, для которого они вызваны. Проблема в том, что в иерархии каждый должен бытьразные класс -createWindowOpts класс для стандартных оконcreateDialogOpts класс для диалогов и тому подобное. Я справился с этим, сделав все шаблоны классов опций. Вот пример:

template <class T>
class _sharedWindowOpts: public detail::_baseCreateWindowOpts {
    public: ///////////////////////////////////////////////////////////////
    // No required parameters in this case.
    _sharedWindowOpts() { };

    typedef T optType;

    // Commonly used options
    optType& at(int x, int y) { mX=x; mY=y; return static_cast<optType&>(*this); }; // Where to put the upper-left corner of the window; if not specified, the system sets it to a default position
    optType& at(int x, int y, int width, int height) { mX=x; mY=y; mWidth=width; mHeight=height; return static_cast<optType&>(*this); }; // Sets the position and size of the window in a single call
    optType& background(HBRUSH b) { mBackground=b; return static_cast<optType&>(*this); }; // Sets the default background to this brush
    optType& background(INT_PTR b) { mBackground=HBRUSH(b+1); return static_cast<optType&>(*this); }; // Sets the default background to one of the COLOR_* colors; defaults to COLOR_WINDOW
    optType& cursor(HCURSOR c) { mCursor=c; return static_cast<optType&>(*this); }; // Sets the default mouse cursor for this window; defaults to the standard arrow
    optType& hidden() { mStyle&=~WS_VISIBLE; return static_cast<optType&>(*this); }; // Windows are visible by default
    optType& icon(HICON iconLarge, HICON iconSmall=0) { mIcon=iconLarge; mSmallIcon=iconSmall; return static_cast<optType&>(*this); }; // Specifies the icon, and optionally a small icon
    // ...Many others removed...
};

template <class T>
class _createWindowOpts: public _sharedWindowOpts<T> {
    public: ///////////////////////////////////////////////////////////////
    _createWindowOpts() { };

    // These can't be used with child windows, or aren't needed
    optType& menu(HMENU m) { mMenuOrId=m; return static_cast<optType&>(*this); }; // Gives the window a menu
    optType& owner(HWND hwnd) { mParentOrOwner=hwnd; return static_cast<optType&>(*this); }; // Sets the optional parent/owner
};

class createWindowOpts: public _createWindowOpts<createWindowOpts> {
    public: ///////////////////////////////////////////////////////////////
    createWindowOpts() { };
};

Это работает, но, как вы можете видеть, это требует заметного объема дополнительной работы: приведение типов к типу возвращаемого значения для каждой функции, дополнительные классы шаблонов и так далее.

У меня вопрос: есть ли в этом случае более простой способ реализации идиомы именованных параметров, который не требует дополнительных затрат?

Ответы на вопрос(6)

Ваш ответ на вопрос