2017-05-24 79 views
10

我建立了一個幫助類,它將通過模板構造一個自定義類,這個自定義類必須繼承某個類,我可以用std::is_base_of來檢查這個。靜態聲明爲公共繼承

但是我還需要檢查繼承是公共的,這怎麼能實現呢?

作爲參考,這裏是一個精簡版的類,我有std::is_base_of在那裏。

template<class CustomSink> 
class Sink 
{ 
    static_assert(std::is_base_of<BaseSink, CustomSink>::value, "CustomSink must derive from BaseSink"); 
    //Some static assert here to check if custom sink has publicly inherited BaseSink 
    //static_assert(is_public..... 
public: 
    template<class... Args> 
    Sink(Args&&... args) 
    { 
    } 
    ~Sink() 
    { 
    }  
}; 

回答

1

由於雙方Quentincpplearner指着我在正確的方向。我發現Quentins答案工作正常,如果斷言應該通過,但在失敗的情況下,static_assert不會捕獲錯誤,而是它會在模板內生成,消除明確static_assert消息的好處。

然後cpplearner提到了std::is_convertible我以前試過用過但忘記了需要*,還有B和D好像是錯誤的。

所有這一切都使我產生:

static_assert(std::is_convertible<Derived*, Base*>::value, "Derived must inherit Base as public"); 

這似乎做的工作,下面是完整的代碼作爲一個完整的例子。

#include <type_traits> 

class Base { }; 
class Derived : Base { }; 
class DerivedWithPublic : public Base { }; 

int main() { 
    static_assert(std::is_convertible<DerivedWithPublic*, Base*>::value, "Class must inherit Base as public"); 
    static_assert(std::is_convertible<Derived*, Base*>::value, "Derived must inherit Base as public"); 
} 
9

據我所知,公共繼承是能夠執行一個隱含的指針轉換(基準轉換可以通過重載運算符來實現)的唯一情況。

template <class T> 
std::true_type is_public_base_of_impl(T*); 

template <class T> 
std::false_type is_public_base_of_impl(...); 

template <class B, class D> 
using is_public_base_of = decltype(is_public_base_of_impl<B>(std::declval<D*>())); 

See it live on Coliru

+3

或者只是使用'std :: is_convertible '? – cpplearner