2013-02-12 73 views
6

我试图做到这一点:条件(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()?

回答

6

试试这个:

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一个),一个用于其条件为假(默认的)。

如果你希望能够重复使用默认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),而不是那个黑客。 (这也可以让你静态断言在B的第一种情况下第二个参数是void)。

+0

神奇的想法,完美的作品。 – user1095108 2013-02-13 00:12:46