条件(SFINAE)覆盖

conditional (SFINAE) override

本文关键字:覆盖 SFINAE 条件      更新时间:2023-10-16

我正在尝试这样做:

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>,一个版本的条件为true(enable_if版本),另一个版本为false(默认版本)。

如果您希望能够重用默认的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; }
};

我们继承了"true"案例中的"false"案例。但这对我来说有点脏——我宁愿把通用实现放在第三个位置(B_impl),而不是那个黑客。(在B的第一种情况下,这也允许您静态断言第二个参数是void)。