2013-02-12 28 views
6

koşullu (SFINAE) geçersiz kılma:Bunu yapmaya çalışıyorum

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; } 
}; 

Caveat, ben devralamaz sınıf şablonları (statik geçersiz kılmaları kullanın). Bu tür bir yapı izinli midir ve şablon üyesi B :: f() öğesi A :: f() üyesini geçersiz kılabilir mi?

cevap

6

bu deneyin: biz Koşul yanlışsa biri için koşul doğru olduğunda bunlardan biri için B<T> iki sürümü, (enable_if bir), (varsayılan bir) sahip

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; } 
}; 

. Varsayılan B uygulanmasını yeniden muktedir istiyorsa, hatta bu yapabileceğini

: Biz "gerçek" durumunda "yanlış" durumda devralan

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; } 
}; 

. Ama bu benim için biraz kirli - Bu uygulamadan ziyade genel uygulamayı üçüncü noktaya (B_impl) koymayı tercih ederim. (Bu ayrıca, ikinci argümanın 'un ilk örneğinde B olduğunu varsaymanızı sağlar).

+0

Harika bir fikir, mükemmel çalışıyor. – user1095108

İlgili konular