這可能是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