9

我正在尝试这样做:

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()?

4

1 回答 1

8

试试这个:

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)。

于 2013-02-12T23:43:38.083 回答