2017-09-12 73 views
-1

我想在基於模板參數的模板中略有不同的邏輯。我該如何鍵入檢查模板參數?模板類型檢查參數C++,不同類型的執行路徑

我有我很驚訝以下不工作:

class Bar { 
    Bar() {} 
} 

template <typename T> 
void Foo(const &T a) { 
    if (!std::is_same<T, Bar>::value) { 
    // Do things that will fail for type Bar e.g. 
    a.Fail(); 
    } 
} 

不希望使用模板特在現實模板特殊化結束共享了大量的代碼爲我的特定目的(目前正在代碼使用模板特)

目前在編譯過程失敗:"no member "Fail" in "Bar"

+1

模板專門化是正確的解決方案。有用的提示:「模板專業化」並不意味着「重複整個龐大的功能,只是改變其中的一小部分」。 –

回答

4

每個分支應該對每個類型都有效。
在C++ 17,你可以使用,如果constexpr這改變:

template <typename T> 
void Foo(const &T a) { 
    if constexpr (!std::is_same<T, Bar>::value) { 
    // Do things that will fail for type Bar e.g. 
    a.Fail(); 
    } 
} 

之前,你必須依靠專業化或過載。 舉例

template <typename T> 
void Fail(const T& t) { t.Fail(); } 

void Fail(const Bar&) { /*Empty*/ } 

template <typename T> 
void Foo(const &T a) { 
    // ... 
    Fail(a); 
    // ... 
} 
+0

有沒有另一種方法可以在C++ 11中實現這個相同的概念? –

+0

您可以查看[constexpr-if-alternative](https://stackoverflow.com/questions/43587405/constexpr-if-alternative)。 – Jarod42

4

而不是專門整個模板功能Foo,專門幫助方法:

template <typename T> 
void FooHelper(const T &a) { 
    a.fail(); 
} 

template <> 
void FooHelper<Bar>(const Bar &a) { 
    // something other than a.fail() 
} 

template <typename T> 
void Foo(const T &a) { 
    FooHelper<T>(a); 
    // etc. etc. 
}