簡化我有下面的類層次結構:避免模板轉換參數
template<typename T>
double foo_template(void* p) {
Vec<T>* v = reinterpret_cast<Vec<T>*>(p);
// use v which involves calling get
return result;
}
double foo(void* p, int type) {
if (type == 0) {
return foo_template<double>(p);
} else if (type == 1) {
return foo_template<int>(p);
} else if (...) {
// etc.
} else {
//unsupported type
}
}
(我可以用一個開關:
class BaseVec {
public:
BaseVec() {};
virtual ~BaseVec() {};
virtual double get_double(int i) const = 0;
};
template<typename T>
class Vec : public BaseVec {
public:
Vec() { ... };
~Vec() { ... };
T get(int i) const { ... };
double get_double(int i) const {
return get(i);
};
};
在項目中,我多次與以下形式的代碼結束並使用枚舉,或先投p
到BaseVec
,然後做dynamic_cast
s,但邏輯保持不變)
這不是主意l保持。例如,當我添加一個我想支持的附加類時,我必須爲每個if-else-if塊添加一個子句。
簡化此操作的一種可能方法是將p
轉換爲BaseVec*
並使用get_double
方法。然而,由於這種方法經常被調用,這導致性能較差。此外,這並不總是可能的:有時我想打電話給get
方法,因爲返回的類型很重要。
我嘗試使用訪問者模式,雖然這有一些優點,但它仍然意味着我必須爲每個可能的模板參數編寫一段代碼。
是否有某種方法可以使此代碼更容易維護?
PS:我沒有(很多)控制foo
的內容。 foo
被外部程序調用(R是確切的)。因此,我只能傳遞通用指針,int,double和character vectors到foo
。
PPS:建議更好的標題也是受歡迎的。
感謝。那會更好。但是,正如我在PS中所說的,我對於傳遞給'foo'的東西幾乎沒有影響。這段代碼最終會在一個被另一個程序調用的庫中(R是確切的)。這個程序不知道'Vec's,所以我得到的是一些泛型指針,我必須將它們轉換爲正確的類型。 –
更新了問題以反映之前的評論。 –