これは、C ++コーディング標準で説明されているスイッチオフルールの場合である可能性があり、正しく実行しているかどうか疑問に思っています。スイッチング関数にまだif句があるので疑問に思います。
クラスA
が直接インスタンス化されることはありません。常に、B
またはC
動的に作成され、への(共有)ポインタを介して均一に処理されA
ます。であるか。foo
であるかに応じて、操作を切り替えて選択します。B
C
class A {
public:
virtual ~A(){}
};
class B : public A {};
class C : public A {};
typedef std::shared_ptr<A> Aptr;
typedef std::shared_ptr<B> Bptr;
typedef std::shared_ptr<C> Cptr;
template<class T>
std::shared_ptr<T> get(const Aptr& pA) {
return std::dynamic_pointer_cast< T >( pA );
}
void foo( const Bptr& pB ) {
std::cout << "operate on B\n";
}
void foo( const Cptr& pC ) {
std::cout << "operate on C\n";
}
void foo( const Aptr& pA ) {
if ( auto x = get<B>(pA) ) {
foo(x);
return;
}
if ( auto x = get<C>(pA) ) {
foo(x);
return;
}
assert(!"oops");
}
int main()
{
Aptr pA( new C );
foo( pA );
}
私の質問は、void foo( const Aptr& pA )
よりエレガントに実装できるかどうかです。それはなしを意味する可能性がありますif
。この状況では、投げ込みget
と巻き込みがfoo
推奨されますか?