![](/img/trans.png)
[英]Overload operator += in template class with std::enable_if metafunction
[英]How can I implement a class template function with a std::enable_if metafunction?
我在我的類模板中使用了std::enable_if
元函數來指定它只允許為具有GameCard
作為基類的變量生成類。 當我實現內聯函數時,這本身就很好用。 但是,如果我想在標頭正文之外實現模板函數,我會遇到無法弄清楚如何正確指定要實現的函數的問題。
縮減示例代碼:
#include <string>
#include <memory>
#include <vector>
struct GameCard {};
template<class T, class = std::enable_if_t<std::is_base_of<GameCard, T>::value>>
struct CardStack {
std::vector<T> cards;
bool Test();
};
我的 IDE 將其生成為函數規范:
template<class T, class>
bool CardStack<T, <unnamed>>::Test() {
return false;
}
這顯然是錯誤的,因為我收到編譯器錯誤。 但我不知道如何正確地做到這一點。 你們中有人知道如何正確地做到這一點嗎?
類外定義應該是:
template<class T, class Enabler>
bool CardStack<T, Enabler>::Test() {
return false;
}
但目前,你的班級可能會被劫持:
而CardStack<int>
或CardStack<int, void>
由於 SFINAE 無法編譯,
CardStack<int, char>
將是“有效的” (由於CardStack
實現中int
產生的硬錯誤而導致無法編譯的風險)。
static_assert
在你的情況下似乎足夠了:
template<class T>
struct CardStack {
static_assert(std::is_base_of<GameCard, T>::value);
std::vector<T> cards;
bool Test();
};
使用更簡單的類定義:
template<class T>
bool CardStack<T>::Test() {
return false;
}
函數成員定義應該是這樣的:
template <class T, class U>
bool CardStack<T, U>::Test() {
// body of function
}
解釋非常簡單,這里沒有魔法。 只需遵循C++的正常語法規則即可。
你的類的定義是一個帶有兩個模板參數的模板類:
template<class, class>
struct CardStack { /* ... */ };
T
是第一個的名字。 另一方面,第二個沒有任何類型名稱,只有一個默認類型( = ...
)。 默認類型(類似於函數的默認參數)不必在定義中指定。
因此,每個方法的定義應采用以下形式:
template <class T, class U>
bool CardStack<T, U>::MethodName() {}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.