![](/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.