[英]Template function specialization vs. Dummy input variable?
我有一個用於創建類的工廠方法模式,我想在繼續實際創建之前驗證輸入參數。 我在這里處理的是兩個類,A和B,它們各自都有自己的驗證。 鑒於我已經在我的創建模板函數中傳遞類類型(A或B),我想直接使用該類型來告訴我需要使用哪個驗證。 我正在考慮使用模板函數專門化或虛擬輸入參數來做到這一點,每個都有自己的優點/缺點。 如果其中任何一個看起來更合理,或者是否還有其他選項,請告訴我。 謝謝!
哦,我確實考慮將驗證作為A或B的靜態方法,但這看起來不太好,因為我正在處理遺留代碼並且移動那些東西並不是太簡單。 為了完整性,我還在下面展示了這個選項。
模板功能專業化:
Pro:能夠直接使用傳入FactoryCreateClass方法的類型來選擇驗證
Con:模板方法沒有被利用,因為只有專業化
template <typename T>
void FactoryCreateClass (int, double)
(
bool bSuccess = ValidateBlock<T>(int, double);
if (bSuccess)
T* = T::CreateInstance();
)
template <typename T>
bool ValidateBlock (int double); // don't need an implementation here since
// all specialization require different validation
template <>
bool ValidateBlock<A> (int, double)
{
//do validation before creating A
}
template <>
bool ValidateBlock<B> (int, double)
{
//do validation before creating B
}
虛擬變量:
Pro:能夠直接使用傳入FactoryCreateClass方法的類型來選擇驗證
Con:未使用的虛擬變量
template <typename T>
void FactoryCreateClass (int, double)
(
bool bSuccess = ValidateBlock(T /*dummy*/, int, double);
if (bSuccess)
T* = T::CreateInstance();
)
bool ValidateBlock (A/*dummy*/, int, double)
{
//do validation before creating A
}
bool ValidateBlock (B/*dummy*/, int, double)
{
//do validation before creating B
}
靜態類方法:
Pro:能夠直接使用傳入FactoryCreateClass方法的類型來選擇驗證
Con:更難以在遺留代碼中進行此類更改
template <typename T>
void FactoryCreateClass (int, double)
(
bool bSuccess = T::ValidateBlock(int, double);
if (bSuccess)
T* = T::CreateInstance();
)
static bool A::ValidateBlock (int, double)
{
//do validation before creating A
}
static bool B::ValidateBlock (int, double)
{
//do validation before creating B
}
你忘記了第三種選擇:使用特征。
template <typename> struct Trait;
template <>
struct Trait<A> {
static bool Validate(int, double);
};
template <>
struct Trait<B> {
static bool Validate(int, double);
};
接着:
template <typename T>
void FactoryCreateClass(int i, double d) {
bool const success = Trait<T>::Validate(i, d);
// ...
}
但是,當然,真正的問題是為什么不直接在CreateInstance
進行驗證?
這里最合適的設計是在CreateInstance
方法中進行驗證,因為任務(args驗證和實例創建)是強耦合的,並且在一個地方將這些事物放在一起更加可讀。
但是,可能是這種情況,您無法更改CreateInstance
方法的代碼。 那么,我發現使用函數模板或虛擬變量之間沒有顯着差異。 后者是 ,然而,有點更明確,因此更具有可讀性。
順便說一句,一個未引用的變量確實不是一個大問題,你可以抑制它,請參閱禁用單個警告錯誤 ,在頁面上搜索UNREFERENCED_PARAMETER
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.