Ich habe eine Situation, wo ich herausfinden muss, ob ein abgeleitetes Objekt in einem Vektor innerhalb eines anderen Objekts gespeichert ist, und diese Funktion zu funktionieren. Ich kann keinen Weg finden, genau das zu tun, was ich will, oder festzustellen, ob es möglich ist. Ich habe eine Lösung, die funktioniert, die ich einschließe, aber es wäre sauberer, wenn es eine direkte Methode gibt, um das Ziel zu erreichen.C++ Ist es möglich, einen Objekttyp in eine Funktion zu übergeben, die verglichen werden soll?
Dies ist im Wesentlichen, was ich tun möchte:
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);
}
Dies ist eine Abhilfe ist, dass das Ziel erreicht, aber es hat den zusätzlichen Schritt den Rückruf zu schaffen, die ich auszurotten lieben würde:
#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);
}
Wie wäre es, die Funktion HasFruit() zu templatisieren? Ich bin kein C++ Experte, also habe ich es noch nicht genau ausgearbeitet, aber so etwas wie 'template bool HasFruit (T *) const {...}' –
@DaveM. Ich hatte das selbe, sehe meine Antwort. –