繁体   English   中英

如何使用 std::enable_if 元函数实现类模板函数?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM