2017-05-08 144 views
1

在我寫的構造函數模板中,我希望在類模板的接口上有一個靜態斷言。情況基本(非編譯)示例如下:類模板接口的靜態斷言

class Baz 
{ 

} 

template<typename T> 
class Bar: public Baz 
{ 

} 

template<typename T> 
class Qux: public Baz 
{ 

} 

class Foo 
{ 
    template<typename T> 
    Foo(T typePar , Baz& baz) 
    { 
     // here I would like to assert that Baz is an interface to a class 
     specialized on T 
    } 
} 

我最好的猜測是一個函數來巴茲的增加,但因爲這不能作爲模板,我不會現在我怎麼能調用,在編譯時間。

+1

你的意思是你想在編譯時檢查'Baz'實際上是對'Bar '或'Qux '的引用嗎?這是不能做到的,因爲動態類型的'baz'在運行時可能是不同的東西。 – TartanLlama

+0

您可以將'Baz&'更改爲模板參數,然後執行檢查,但是您無法將'Baz'傳遞給您的構造函數,您需要首先進行投射。 – TartanLlama

+0

我明白你的意思了。將它改爲模板參數對我來說不是一個真正的選擇。於是我只想放棄這個靜態斷言 – laurisvr

回答

-1

如果你想「......斷言Baz是專門在T一類的接口」,如果我可以將其解釋爲「......斷言TBaz一超」,那麼你就可以static_assert此如下:

class Foo 
{ 
    template<typename T> 
    Foo(T typePar , Baz& baz) 
    { 
     // assert that T is a base class of Baz 
     static_assert(std::is_base_of<T, Baz>::value, "T is not a base class of Baz."); 
    } 
}; 

這也適用於的Baz任何亞類中,因爲傳遞性的(如果TBaz超類,那麼T也是Baz每個子類的類的超類)。

但是請注意,你不能靜態地斷言對函數參數baz什麼,因爲函數的參數不能是常量表達式。

+0

我不認爲你的理解是正確的。你可以看到'Baz'不從任何繼承。OP希望確保動態類型Baz'的''是酒吧'或'Qux ',但你可以在編譯時不會這樣做。 – TartanLlama