【问题标题】:conditional (SFINAE) override有条件 (SFINAE) 覆盖
【发布时间】:2013-02-12 23:35:25
【问题描述】:

我正在尝试这样做:

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

【问题讨论】:

    标签: c++ templates c++11 sfinae


    【解决方案1】:

    试试这个:

    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&lt;T&gt;,一个条件为真(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)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-21
      • 2013-07-21
      • 2020-02-17
      • 2018-09-27
      相关资源
      最近更新 更多