std::any
特定の基本クラスの派生クラスへのポインタを含む場合と含まない場合があるオブジェクトがあるとしますB
。私ができることはありますか?
- 返し
B *
、あればstd::any
オブジェクトはコンバーチブル何かを保持するB *
、または - そうでない場合、例外をスローしますか?
それはのように思えるdynamic_cast
し、std::any_cast
それぞれが、この機能の半分を提供しますが、私は2つを一緒に入れてのいずれかの方法で表示されません。
に変換可能なすべての型を明示的に列挙することを含むさまざまな方法でこれを機能させることができることは知っていますがB *
、それはすべてのDRY違反の母です。
使用例:
std::vector<std::any> setupTools(const std::string & confFile)
{
std::vector<std::any> myTools;
auto conf = parse(confFile);
for(std::string & wrenchInfo : conf["Wrenches"])
{
Wrench::setup(myTools, wrenchInfo);
}
for(std::string & hammerInfo : conf["Hammers"])
{
Hammer::setup(myTools, hammerInfo);
}
// 25 more kinds of tools
}
Factory1::init(const std::vector<std::any> & tools)
{
m_wrench = any_get<Wrench *>(tools);
m_hammer = any_get<Hammer *>(tools);
m_saw = any_get<Saw *>(tools);
}
Factory2::init(const std::vector<std::any> & tools)
{
m_wrench = any_get<TorqueWrench *>(tools);
}
Factory3::init(const std::vector<std::any> & tools)
{
m_saw = any_get<CordlessReciprocatingSaw *>(tools);
}
-私はちょうどので、私はのこぎりつかむことができる存在でのこぎりのすべての単一の種類をリスト定型コードの束含めたくない任意の Saw
-で使用するがFactory1
。
明白なことを述べるリスクがあるので、
—
ブライアン
B*
sをstd::any
オブジェクトに入れるだけで、派生クラスのポインタは入れないことに同意すると、問題は非常に簡単に解決します。
それがあなたのユースケースに適合しない場合、あなたのユースケースを説明できますか?
—
Alan Birtles
すべての場合は
—
Alan Birtles
myTools
ツールがある理由だけではなく、持っているTool
基本クラスを作ると?myTools
std::vector<std::unique_ptr<Tool>>
@DanielMcLaury:「のこぎりとハンマーの間に重複する機能はありません」では、なぜ同じ配列にあるのですか?それらを同じ場所に固定したいように見えるので、それらの間には明らかにいくつかの論理的な共通点があります。つまり、なぜ
—
Nicol Bolas
myTools
存在するのか理解できません。完全に異なるオブジェクトであると主張するものをその中に入れ、次にそれらを反復して、そこに何を入れたかを思い出そうとするのはなぜですか?
std::any
これを使用する必要があるのか、そして全体的に何を解決しようとしているのかについて説明できますか?これは非常に厄介な問題のように聞こえ、おそらくそれを回避するより良い方法があるでしょう