这可能是 C++ 编码标准中解释的关闭规则的一种情况,我想知道我是否正确执行。我想知道,因为我在切换功能中仍然有 if 子句。
类A
永远不会被直接实例化,它总是要么B
动态C
创建,要么通过指向A
. foo
根据是 anB
还是来切换和选择操作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
?