[英]How to implement a class that has a significantly different implementation in one case?
我正在嘗試實現一種數據結構來管理n維向量不大於50的n維向量。
問題是n = 2是一個特例,它具有相同的接口,但實現方式卻完全不同。 我該如何實施?
我正在考慮使n為模板參數,並且:
有沒有更好的辦法? 如果按照我的建議實施它,應該注意些什么?
IMO一個工廠,它為n = 2的特殊情況提供一種實現,而為所有其他情況提供不同的實現是最簡單,最優雅的實現方式。
答案取決於n
是在編譯時還是僅在運行時已知。
如果n
在編譯時是已知的,則要使用部分模板規范(與std::vector<bool>
是模板規范的精神相同)。
如果n
僅在運行時已知,則可以實現一種狀態模式,以將對象保持在執行操作的矢量的內部,對其進行兩種實現,並將指向其實例的指針隱藏在矢量對象內:
struct Vector;
struct VectorOperations {
virtual void doOperation1(Vector& v) = 0;
virtual void doOperation2(Vector& v) = 0;
};
struct VectorOperationsTwo: VectorOperations {
virtual void doOperation1(Vector& v);
virtual void doOperation2(Vector& v);
} opsTwo;
struct VectorOperationsThreeAndMore: VectorOperations {
virtual void doOperation1(Vector& v);
virtual void doOperation2(Vector& v);
} opsThreeAndMore;
class Vector {
VectorOperations *ops;
public:
Vector(int size) {
ops = size == 2 ? (VectorOperations*)&opsTwo : &opsThreeAndMore;
}
void operation1() {
ops->doOperation1();
}
void operation2() {
ops->doOperation2();
}
friend class VectorOperationsTwo;
friend class VectorOperationsThreeAndMore;
};
此示例假定兩個元素的向量和兩個以上元素的向量將具有相同的數據成員,因此我共享了opsTwo
和opsThreeAndMore
。 如果不是這種情況,則可以在構造函數中分配新的VectorOperationsTwo
或VectorOperationsThreeAndMore
。
我認為容器尺寸在運行時是已知的,因此基於teplate專業化的解決方案不起作用。
那PIMPL習慣用法呢? 存儲兩種實現,一種用於一般情況,一種用於特殊情況。
部分模板專業化。 接口的共享部分可以從非模板(或至少非專用)基類繼承。
原因是數據的維數不是運行時變量,而是取決於域的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.