私は多くのboost::anyのベクトルを持っていますこのベクトルでは、std::vectorとタイプIContainerの要素に対していくつかの操作を実行する必要があります
class IContainer
{
public:
virtual ~IContainer(){}
virtual const boost::any operator[](std::string) const = 0;
};
class AContainer : public IContainer
{
std::vector<int> vect_;
std::string name_;
public:
AContainer() : vect_({0, 1, 2, 3, 4, 5}), name_("AContainer") {}
virtual const boost::any operator[](std::string key) const
{
if (key == "str")
return (name_);
if (key == "vect")
return (vect_);
return nullptr;
}
};
だから私は次の機能を実行しました(imoはかなり醜いです)が、誰が正しく動作しますか
メートルはconst std::vector<boost::any>&
for (const auto & elem : m)
{
try
{
std::vector<int> v = boost::any_cast<std::vector<int>>(elem);
display(v);
}
catch(boost::bad_any_cast){}
try
{
std::vector<IContainer*> v = boost::any_cast<std::vector<IContainer*>>(elem);
display(v);
}
catch(boost::bad_any_cast){}
try
{
AContainer v(boost::any_cast<AContainer>(elem));
try
{
display(boost::any_cast<const std::vector<int>>(v["vect"]));
}
catch (boost::bad_any_cast){}
try
{
std::cout << boost::any_cast<const std::string>(v["str"]) << std::endl;
}
catch (boost::bad_any_cast){}
try
{
display(boost::any_cast<std::vector<int> >(v));
}
catch (boost::bad_any_cast) {}
}
catch(boost::bad_any_cast){}
}
多くの " try{}try{}catch{}
" を追加しようとしましたが、うまくいきません
私がやったことよりも良い解決策はありますか
編集
James Kanze、user1131467、および Praetorian のソリューションを試しました
したがって、3つはうまく機能していますが、実行時間を計算すると、user1131467の答えは他の答えよりも少し高速です。このすべての if/else を回避するために、各タイプをマップに格納するソリューションを見つける必要があります
また、boost::variant も見ていきます。