由於幾天以來,我被困在模板問題,你一次解決我的每個問題,所以提前謝謝你。CRTP編譯檢測與模板組合
所以我的模板(tl1
)誰在乎uml composition
,和另一個模板(tl2
)至極是uml composed
所以我的目標是,如果composed
對象不是tl2
如果一個derived
不編譯typename D
不是tl1 derived
。
#include <type_traits>
#include <list>
#include <string>
template <typename T, typename C>
class tl2 ;
template <typename D, typename T>
class tl1 {
private:
static_assert(std::is_base_of<tl2<T, D>, T>::value, "T should inherit from tl2");
std::list<T> mTs ;
tl1() {} ;
friend D ;
public:
T & getTbyName() const ;
};
template <typename T, typename C>
class tl2 {
//static_assert(std::is_base_of<tl1<C, T>, C>::value, "D should inherit from Database");
public:
std::string getName() { return mName ; }
private:
C & mC ;
std::string mName ;
};
class cl1 ;
class cl2 : public tl2<cl2, int> {
};
class cl1 : public tl1<int, cl2> {
};
我的問題是這樣的編譯非常好,我想不會。 我想不編譯,因爲D
從tl1<D, T>
必須derived
從tl1
。
而實際上class cl1 : public tl1<int, cl2>
是不正確的,但它編譯。所以爲什麼?
如果我改變cl1
到它不會編譯:
class cl1 : public tl1<int, cl2> {
cl1() {}
};
我明白爲什麼它不會改變後編譯,但我不明白爲什麼它之前編譯。
事實上是tl1
和tl2
將在庫中,所以我想執行庫中的所有檢查。我將無法控制派生,所以我想確保implementation
是tlX derived
。
再次感謝您的時間。
Quentin
「我的問題是這樣的編譯非常好,我想不會。」爲什麼?通常問題是某些東西不能編譯,你會希望它能夠complile。 「如果我將cl1更改爲:...它不會編譯......」cl1已經按照您的指示進行了定義,並且這個編譯沒有任何問題。你的問題不清楚,令人困惑。你需要澄清他們。 –
@SamVarshavchik現在的描述更清晰了嗎? –
'std :: is_base_of_,T> :: value'檢查T是否來自t12,,但是你在哪裏檢查'std :: is_base_of:: value'(D從Tl1導出)。 –
Brandon