提问者:小点点

C++fluent接口


我正在为我的C++GUI库实现一个fluent接口。 基本概念是每个函数返回一个指向模板的指针。

这是两个类。

template <class T>
class wnd {
public:
    T* set_id(int id) { id_ = id; return (T*)this; }
    T* set_text(std::string text) { text_ = text; return (T*)this; }
protected:
    int id_;
    std::string text_;
};
    
class app_wnd : public wnd<app_wnd> {
public:
    app_wnd* show() { std::cout << text_ << " " << id_; return (app_wnd*) this; }
};

这很管用。 当使用app_wnd时,子函数返回正确的t*,即app_wnd*。 因此,我可以执行(new app_wnd())->set_id(0)->set_text("hello world“)->show();

当我做另一个推导时,问题就开始了。

class main_wnd : public app_wnd {
public:
    main_wnd* set_app_instance(int instance) { instance_ = instance; return (main_wnd *) this; }
protected : 
    int instance_;
};

这个类不知道底层模板,只要我调用set_id(),它就返回app_wnd类,丢失main_wnd的方法,即(newmain_wnd())->set_id(0)->set_app_instance(10);将失败,因为set_id函数将返回app_wnd*而不是main_wnd*。

有没有一个干净的,好的,不复杂的解决方案?


共1个答案

匿名用户

您可以这样做:

template <class T>
class wnd {
public:
    T* set_id(int id) { id_ = id; return (T*)this; }
    T* set_text(std::string text) { text_ = text; return (T*)this; }
protected:
    int id_;
    std::string text_;
};
template<class Derivate>
class app_wnd : public wnd<Derivate> {
public:
    app_wnd* show() { std::cout << wnd<app_wnd<Derivate>>::text_ << " " << wnd<app_wnd<Derivate>>::id_; return (Derivate*) this; }
};
class main_wnd : public app_wnd<main_wnd> {
public:
    main_wnd* set_app_instance(int instance) { instance_ = instance; return (main_wnd *) this; }
protected :
    int instance_;
};
int main(){
    (new main_wnd())->set_id(0)->set_app_instance(10);
}

(受CRTP启发)。

您将无法实例化更多的app_wnd

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++fluent|接口)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?