У меня возникла ситуация, когда мне нужно выяснить, хранится ли производный объект в векторе внутри другого объекта, и хотите его функционировать. Я не могу найти способ сделать то, что хочу, или определить, возможно ли это. У меня есть решение, которое работает, в которое я включаю, но было бы более чистым, если бы был прямой метод для достижения цели.C++ Можно ли передать тип объекта в функцию, подлежащую сравнению с
Это, по сути, что я хочу сделать:
class IFruit
{
public:
virtual ~IFruit(){};
};
class Apple : public IFruit {};
class Banana : public IFruit {};
class Orange : public IFruit {};
class FruitBowl
{
public:
bool HasFruit(datatype?? FruitType)
{
for (auto iter : m_Fruit)
{
if (typeof(iter) == typeof(FruitType))
{
return (true);
}
}
return (false);
}
vector< IFruit* > m_Fruit;
};
int main()
{
FruitBowl Snacks;
Snacks.m_Fruit.push_back(new Banana);
Snacks.m_Fruit.push_back(new Apple);
Snacks.m_Fruit.push_back(new Orange);
if (Snacks.HasFruit(Orange))
{
cout << "There is an orange available";
}
return (0);
}
Это обходной путь, который достигает цели, но это имеет дополнительный этап обеспечения обратного вызова, который я хотел бы, чтобы уничтожить:
#include <vector>
#include <iostream>
#include <functional>
using namespace std;
class IFruit
{
public:
virtual ~IFruit(){};
};
class Apple : public IFruit {};
class Banana : public IFruit {};
class Orange : public IFruit {};
class FruitBowl
{
public:
bool HasFruit(function< bool(IFruit*) > fnCompareFruitType)
{
for (auto iter : m_Fruit)
{
if (fnCompareFruitType(iter))
{
return (true);
}
}
return (false);
}
vector< IFruit* > m_Fruit;
};
int main()
{
FruitBowl Snacks;
Snacks.m_Fruit.push_back(new Banana);
Snacks.m_Fruit.push_back(new Apple);
Snacks.m_Fruit.push_back(new Orange);
if (Snacks.HasFruit([](IFruit* TestFruit){ return (dynamic_cast< Orange* >(TestFruit) != nullptr); }))
{
cout << "There is an orange available";
}
return (0);
}
Как насчет шаблонизации функции HasFruit()? Я не эксперт на C++, поэтому я еще не разработал его, но что-то вроде 'template bool HasFruit (T *) const {...}' –
@DaveM. У меня было то же самое, хотя, см. Мой ответ. –