这可能是C++编码标准中解释的关闭规则的一种情况,我想知道我是否正确地执行了此操作。我想知道,因为我仍然有交换功能中的if-clause。如何正确关闭?
类A
永远不会被直接实例化,它总是要么B
或获得动态创建并通过(共享)指针均匀地处理,以A
C
。 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
?
使用虚拟功能? – GManNickG 2013-03-02 21:53:25
'B'和'C'具有非常不同的界面。有些是常见的,并留在'A'中。所以,我不想通过虚拟操作。 – ritter 2013-03-02 21:55:05
'B'和'C'在'foo()'旁边仍然可以有不同的接口。 – 2013-03-02 21:59:26