我需要一种通用的方法来创建任何类型的实例。此任务需要从非模板对象执行,因此我目前正在使用如下接口:
class Interface
{
public:
virtual void PlacementCopy( void *data, const void *src ) const = 0;
virtual void PlacementNew( void *data ) const = 0;
virtual void PlacementDelete( void *data ) const = 0;
virtual void Delete( void *data) const = 0;
virtual void Copy( void *dest, const void *src ) const = 0;
virtual void NewCopy( void **dest, const void *src ) const = 0;
virtual void *New( ) const = 0;
};
这都是自定义反射系统的一部分,因此它的使用方式如下:
int *p = META( int )->Interface->New( );
*p = 10;
这通过创建一个派生自 的模板化对象来工作Interface
,该对象包含要构造的类型。Interface 中的New
运算符默认构造类型:
template <typename T>
class Derived : public Interface
{
virtual void *New( void ) const override
{
return new T( );
}
};
问题:以这种方式构造的所有类型都必须提供默认构造函数。我想以某种方式允许将任意参数传递给相关类型的构造函数。
我不知何故需要能够做到:
MetaInfo *meta = META( SomeType );
SomeType *object = meta->New( arg1, arg2 );
在实现中可能看起来像这样:
template <typename T>
Derived : public Interface
{
template <typename ... Args>
virtual void *New( Args&& ... args ) const override
{
new T( std::forward<Args>( args ) ... );
}
};
该MetaInfo
对象不是模板类型,因此很难提出参数转发解决方案。我不能简单地模板化类中的New
方法Derived
,因为您不能模板化虚拟方法。
如果没有一些疯狂的代码预处理,我的要求是否可能?