簡體   English   中英

模板函數專業化與虛擬輸入變量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM