templates - 可以将 MFC 模板基类与 DECLARE_DYNAMIC() 一起使用吗?
问题描述
我的应用程序中有几个几乎相同的视图,所以我决定创建一个 CBaseView 类并且不复制代码。所以我有这样的事情:
template <class BASE_T, class BASE_DOC, class BASE_DLG>
class CBaseView : public CListView
{
DECLARE_DYNCREATE(CBaseView<BASE_T, BASE_DOC, BASE_DLG>)
void func1()
{
// GetData() is just another method in CBaseView
BASE_T oData = GetData();
...
}
void func2()
{
BASE_DOC* pDocument = (BASE_DOC*) CView::GetDocumet();
pDocument->DoSomething();
...
}
void func3()
{
...
BASE_DLG oBaseDlg();
oBaseDlg.DoModal();
...
}
}
IMPLEMENT_DYNCREATE(CBaseView<BASE_T, BASE_DOC, BASE_DLG>, CListView)
之后,我想将 CBaseView 用于其他视图:
CMyView : public CBaseView <MyType, MyDocument, MyDlg> {...};
问题来了:
DECLARE_DYNCREATE(CBaseView<BASE_T, BASE_DOC, BASE_DLG>)
和
IMPLEMENT_DYNCREATE(CBaseView<BASE_T, BASE_DOC, BASE_DLG>, CListView)
它给了我一些奇怪的错误。我看到我不能将此宏与模板类一起使用。还发现了一个类似的主题,但我在 MFC 中(以及在所有编程领域)都很新,我无法重写它以适用于我的三个模板参数。
我担心我尝试了我能想到的一切,但仍然没有做到。我真的需要找到一种方法或至少另一种方法,所以请大家帮帮我!
解决方案
我不知道 MFC,但问题很清楚:宏不接受模板实例化。这是可以理解的,因为宏首先被扩展,一旦你实例化模板,你就不会有类似的CBaseView<BASE_T, BASE_DOC, BASE_DLG>
东西CBaseView<Foo,FooDoc,FooDlG>
,即参数的具体类型。
DECLARE_DYNCREATE
是在运行时动态创建实例,而模板仅在编译时存在,因此在某些时候您需要决定要在运行时使用模板的哪些实例化。您可以将实现保留在模板中,但对于您使用的框架使用的类型:
class View1 : public CBaseView<Foo1,FooDoc1,FooDlg1> {
DECLARE_DYNCREATE(View1)
};
IMPLEMENT_DYNCREATE(View1,CListView)
class View2 : public CBaseView<Foo2,FooDoc2,FooDlg2> {
DECLARE_DYNCREATE(View2)
};
IMPLEMENT_DYNCREATE(View2,CListView)
推荐阅读
- jquery - jQuery owl carousel 使用变量定义选项
- bluetooth - 使用 Flora Bluefruit LE 作为音乐控制器
- sql - 为什么这个查询在用作子查询时会给出不同的结果?
- javascript - 如何在javascript中测试通过openapi规范部署的HTTP请求参数
- ubuntu - 如何在 Windows 初始 shell 路径上更改 WSL ubuntu?
- azure - 我需要 docker 在 linux ubuntu 上运行 azure data studio 吗?
- css - 进度条上的自定义标记无法根据窗口大小动态变化
- svg - SVG foreignObject 包含在使用中 - 它有效吗?
- javascript - 如何区分 R/Shiny 可反应 javascript 回调中的按钮?
- jestjs - 从具有多个导出的文件中模拟常量