gpt4 book ai didi

c++ - 模板类和根据迭代调用不同的构造函数

转载 作者:行者123 更新时间:2023-11-30 02:18:41 24 4
gpt4 key购买 nike

我正在学习 ECS,现在正尝试为我的项目实现组件。

所以为了让您了解情况,我有一个水族馆,里面有很多组件(比如海藻和鱼)。两者都有年龄,但只有鱼有种族。

我有一个针对 general_components(年龄和其他内容)的类和一个针对鱼类特定成分(种族、性别等)的类。

我用一个看起来像这样的创建方法创建了一个模板组件类:

template<typename ConcreteComponent> // ConcreteComponent is attached to the class
ConcreteComponent& Components<ConcreteComponent>::create( entity e ) {
m_components.push_back( ConcreteComponent(e) );
return m_components.back();
}

我遇到的问题是我希望能够根据我拥有的类调用不同的构造函数(而不是这里的实体 e,它对我设置中的每个类都是通用的),但同时保持最有效的方式(所以有了模板,每个类(class)都没有复制粘贴)。对于我的问题,这不会是世界末日,但总的来说,如果我再次遇到这个问题,我想做好准备。

有没有办法用不同的参数调用一个创建函数?

例如:

A<fishComponents> myClassIter;
myClassIter.create("name", age, race, sex)

对于鱼会通过 "name",age,race,sexConcreteComponent()构造函数而不仅仅是 e (我有一个 "name",age,race,sexfishComponents 构造函数)。

TL;DR:在模板类方法中,是否可以根据参数将不同数量和性质的值传递给所用类的构造函数

template<typename A>
void myClass<A>::create( list_of_parameters) {
A(list_of_parameters) /*calls the constructor of the template class A */
}

我在 C 中看到过类似的东西,但建议不要触摸它,因为它已过时且不再使用。

最佳答案

这里的解决方案是使用参数包和 std::forward 将传入的任何参数传递给真正的构造函数。下面是一个完整但简化的示例(没有数据结构,每种类型一个参数):

#include <iostream>

class Fish {
public:
Fish(std::string const &name) {
std::cout << "Making a fish named " << name << '\n';
}
};

class Seaweed {
public:
Seaweed(int length) {
std::cout << "Making a seaweed that's " << length << " feet long\n";
}
};

template <typename ConcreteComponent, typename ...ARGS>
ConcreteComponent create(ARGS && ...args) {
return ConcreteComponent(std::forward<ARGS>(args)...);
}

int main() {
create<Fish>("Bob");
create<Seaweed>(42);
return 0;
}

输出:

$ ./forwarding
Making a fish named Bob
Making a seaweed that's 42 feet long

关于 std::forward 值得一读,但我们在这里基本上做的是获取所有进入 create 的内容并将其传递给类型的构造函数,同时还保留有关类型的属性(例如,它是否是临时的)。因此,您可以传递任何东西,只要有一个有效的构造函数来传递东西即可。

我的代码已通过使用 C++11、14 和 17 的 g++-7.3.0 进行了测试。

关于c++ - 模板类和根据迭代调用不同的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51914863/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com