gpt4 book ai didi

c++ - 从对象 vector 返回特定类的对象

转载 作者:行者123 更新时间:2023-12-03 12:51:49 24 4
gpt4 key购买 nike

我需要一个函数来从另一个类的组件数组中查找类类型的组件。

此函数不起作用,并且在使用时给出“类型名称不允许”...

template<typename T> auto* GetComponent(T& comp)
{
for (int i = 0; i < Components.size(); ++i)
{
if (static_cast<T*>(Components.at(i))) return Components.at(i);
}

}

最佳答案

这是一个使用 dynamic_cast 而不是 static_cast 的示例,如 Jarod42 所建议。两个模板,For 对每个匹配类型执行仿函数,GetComponent 更接近问题中提供的代码片段。

#include <iostream>
#include <memory>
#include <vector>

namespace {

struct Animal { virtual ~Animal(); };

Animal::~Animal() = default;

struct Horse : Animal { };

struct Dog : Animal { };

struct Zebra : Animal { };

struct Cow : Animal {
std::string noise;
Cow(std::string noise_) : noise{std::move(noise_)} { }
void print(std::ostream&) const;
};

void Cow::print(std::ostream& out) const {
out << "Cow says " << noise << "\n";
}

template <typename T, typename C, typename F>
void For(C const& container, F fn) {
for (auto const& item : container) {
auto p = dynamic_cast<T const*>(item);
if (p != nullptr) fn(*p);
}
}

template<typename T, typename C> auto* GetComponent(C const& container) {
for (auto const& item : container) {
auto p = dynamic_cast<T const*>(item);
if (p != nullptr) return p;
}

return static_cast<T const*>(nullptr);
}


} // anon

int main() {
Horse horse;
Cow cow1{"moo"};
Dog dog;
Cow cow2{"snort"};

std::vector<Animal*> v;
v.push_back(&horse);
v.push_back(&cow1);
v.push_back(&dog);
v.push_back(&cow2);

For<Cow>(v, [](Cow const& cow) { cow.print(std::cout); });

auto first_cow = GetComponent<Cow>(v);
std::cout << "first cow:";

if (first_cow) first_cow->print(std::cout);
else std::cout << "(null)\n";

auto first_dog = GetComponent<Dog>(v);
std::cout << "first dog:" << (first_dog ? "yes" : "(null)") << "\n";

auto first_zebra = GetComponent<Zebra>(v);
std::cout << "first zebra:" << (first_zebra ? "yes" : "(null)") << "\n";
}

关于c++ - 从对象 vector 返回特定类的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61916965/

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