派生オブジェクトが別のオブジェクト内のベクトルに格納されているかどうかを調べる必要がある状況があります。私は自分が望むものを正確に行う方法や、それが可能かどうかを判断する方法を見つけ出すことはできません。私は、私が含んでいる解決策を持っていますが、目標を達成するための直接的な方法があれば、より洗練されたものになります。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++の専門家ではないので、まだ正確には取り組んでいませんが、テンプレートのようなものですが、テンプレート bool HasFruit(T *)const {...} ' –
@DaveMのようなものです。私も同じでしたが、私の答えを見てください。 –