Melhor maneira de usar o idioma de parâmetro nomeado C ++?

Estou desenvolvendo uma biblioteca de GUI para Windows (como um projeto paralelo pessoal, sem aspirações de utilidade). Para minha classe da janela principal, configurei uma hierarquia de classes de opção (usando oIdioma do parâmetro nomeado), porque algumas opções são compartilhadas e outras são específicas para tipos específicos de janelas (como caixas de diálogo).

Do modo como o Idiom de Parâmetro Nomeado funciona, as funções da classe de parâmetro precisam retornar o objeto em que são chamados. O problema é que, na hierarquia, cada um deve ser umdiferente classe - ocreateWindowOpts classe para janelas padrão, ocreateDialogOpts classe para diálogos e afins. Eu lidei com isso criando todos os modelos de classes de opção. Aqui está um exemplo:

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() { };
};

Funciona, mas como você pode ver, requer uma quantidade notável de trabalho extra: uma conversão de tipo no tipo de retorno para cada função, classes extras de modelos, etc.

Minha pergunta é: existe uma maneira mais fácil de implementar o idioma do parâmetro nomeado nesse caso, que não exija todo o material extra?

questionAnswers(6)

yourAnswerToTheQuestion