2013-02-12 67 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