我尝试使用mixin创建基于组件的实体。要定义实体,我有一个模板类,将所有组件作为模板参数:
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
Aspose.Words.Style style = doc.Styles.Add(StyleType.Paragraph, "newStyle");
style.IsQuickStyle = true;
style.Font.Size = 24;
style.Font.SizeBi= 24;
style.Font.Name = "B Mitra";
style.Font.NameBi= "B Mitra";
builder.ParagraphFormat.Style = style;
builder.Writeln("سلام");
要定义新实体,我只需创建一个typedef:
template<typename Mixin>
struct EntityFactoy : Mixin, Entity
{
void preUpdate(float dt)
{Mixin::mixinPreUpdate(dt);}
void update(float dt)
{Mixin::mixinUpdate(dt);}
void lateUpdate(float dt)
{Mixin::mixinLateUpdate(dt);}
};
现在我想将构造函数传递给此模板,因此实体可以初始化它的组件。
using MyEntity = EntityFactory<Component1<Component2<ComponentN<>>>>;
我尝试了一些事情,例如传递一个可变参数模板,甚至切换到一个丑陋的宏,但它们都没有像我想的那样工作。请注意,mixins都有默认构造函数。
编辑:
我尝试使用可变参数模板,但我仍然不知道如何在那里实现:
x = Entity1(3, 2.2f, "string");
y = Entity2("string", &x);
或以某种方式将函数作为模板传递:
template<typename Mixin, typename CtrArgs>
struct EntityFactory : Mixin, Entity
{
EntityFactory(CtrArgs&&... args)
{
//Define this via a template parameter
}
void preUpdate(float dt)
{Mixin::mixinPreUpdate(dt);}
void update(float dt)
{Mixin::mixinUpdate(dt);}
void lateUpdate(float dt)
{Mixin::mixinLateUpdate(dt);}
};
宏是唯一的方法吗?