我正在为我的C++ GUI库实现一个流畅接口。基本概念是每个函数都返回一个模板的指针。
这里有两个类。
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的方法,即(new main_wnd())->set_id(0)->set_app_instance(10);
将失败,因为set_id函数将返回app_wnd*而不是main_wnd*。
有没有一个干净、好的、非复杂的解决方案?
new app_wnd()
,因为app_wnd
是一个模板。由于示例无法正常工作,所以您现在遇到的问题不仅仅是这个(而且class app_wnd : public wnd<app_wnd>
也无法编译)。 - Alberto Sinigagliatemplate<typename T> class app_wnd : public wnd<T> { ... }; class main_wnd : public app_wnd<main_wnd> { ... };
- Raymond Chenclass app_wnd : public wnd<app_wnd>
为什么不行呢?app_wnd
并不完整,但也没有必要。 - 463035818_is_not_a_number