c++ - 条件 (SFINAE) 覆盖

标签 c++ templates c++11 sfinae

我正在尝试这样做:

struct A
{
  virtual int f() const { return 0; }
};

template <typename T>
struct B : A
{
  template <typename U = T,
    typename std::enable_if<...some condition involving U...>::type>
  int f() const { return 1; }
};

注意,我不能继承类模板(使用静态覆盖)。这种构造是否允许,模板成员 B::f() 是否可以覆盖成员 A::f()?

最佳答案

试试这个:

template <typename T, typename=void>
struct B : A
{
  ...
};

temlate <typename T>
struct B<T, typename std::enable_if<...some condition...>::type>:
  A
{
  virtual int f() const override { return 1; }
};

我们有两个版本的 B<T> ,一个条件为真(enable_if),一个条件为假(默认)。

如果您希望能够重用您的默认 B实现,你甚至可以这样做:

template <typename T, typename=void>
struct B : A
{
  ...
};

template <typename T>
struct B<T,  typename std::enable_if<...some condition...>::type>:
  B<T, bool>
{
  virtual int f() const override { return 1; }
};

我们从“真”案例中的“假”案例继承。但这对我来说有点脏——我宁愿将通用实现放在第三个位置 ( B_impl ) 而不是那个 hack。 (这也让你静态断言第二个参数是 void 在第一种情况下 B )。

关于c++ - 条件 (SFINAE) 覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14843900/

相关文章:

c++ - 第一个 fstream 程序

c++ - 避免虚拟模板函数

templates - 如何在Grails 3.x中创建可重用的布局和脚手架模板

c++ - 如何在 C++ 的 STL 容器值中拥有 const 成员?

C++:为什么 const_cast 是邪恶的?

模板参数中的 C++ 继承

c++ - 我们应该为函数的返回值使用临时变量吗?

C++通用模板化类算术

c++ - 使用 C++11 可变参数模板编写多维 "MathFunction"类

C++ 模板 : cannot match the last template in variadic class template