MFC IMPLEMENT_DYNCREATE与模板

时间:2009-09-29 11:29:13

标签: c++ mfc

有没有办法将IMPLEMENT_DYNCREATE与模板类一起使用?如果没有,为什么不呢?还有另一个解决方案吗?

示例:

template<typename T>
class A : public B{
public:
A(){ printf("A constuctor "); }
void fn( ){ T* a = new T(); }
};

IMPLEMENT_DYNCREATE(A<CObject>, B);

2 个答案:

答案 0 :(得分:2)

好的,我已经快速浏览了一下宏并将一个完全未经测试的宏放在一起可能会有效。

#define _RUNTIME_CLASS(class_name, template_name) ((CRuntimeClass*)(&class_name<template_name>::class##class_name##template_name))
#define RUNTIME_CLASS(class_name, template_name) _RUNTIME_CLASS(class_name, template_name)

#define _IMPLEMENT_RUNTIMECLASS( class_name, template_name, base_class_name, wSchema, pfnNew, class_init ) \
                                 AFX_COMDAT CRuntimeClass class_name<template_name>::class##class_name##template_name = { \
                                 #class_name, sizeof(class class_name<template_name>), wSchema, pfnNew, \
                                 RUNTIME_CLASS(base_class_name), NULL, class_init }; \
                                 CRuntimeClass* class_name<template_class::GetRuntimeClass() const \
                                 { return RUNTIME_CLASS(class_name, template_name); }

#define IMPLEMENT_DYNCREATE( class_name, template_name, base_class_name ) \
                             CObject* PASCAL class_name<template_name>::CreateObject() \
                             { return new class_name<template_name>; } \
                             IMPLEMENT_RUNTIMECLASS(class_name, template_name, base_class_name, 0xFFFF, \
                             class_name<template_name>::CreateObject, NULL)

然后你可以打电话:

IMPLEMENT_DYNCREATE( A, CObject, B);

尝试一下,正如我所说,它可能会起作用:D

答案 1 :(得分:0)

Visual Studio 2005基本上支持模板运行时类,但是自Visual Studio 2010(或2008)以来,微软已经开始使用宏了。

解决方案:从visual studio 2005的afx.h复制模板类运行时宏,并制作一份.h个文件。