2016-08-22 283 views
8

是一類MyClass與一個模板參數C++類模板參數必須具有給定一個特定的父類

template<typename T> 
class MyClass 
{ 
    //... 
}; 

和另一類MySecondClass與兩個模板參數。

template<typename T, typename U> 
class MySecondClass 
{ 
    //... 
}; 

我想要做的是限制MyClass只允許一個T即是MySecondClass派生類型。我已經知道我需要像

template<typename T, typename = std::enable_if<std::is_base_of<MySecondClass<?,?>, T>::value>> 
class MyClass 
{ 
    //... 
} 

,我只是不知道要放什麼東西在爲?,因爲我希望讓所有可能的MySecondClass的。

+0

我編輯的問題。如果您覺得不正確,請將其滾回 – NathanOliver

+0

我想知道鍛鍊的重點。你打算如何使用'T'由'MyParentClass'的某個實例派生的事實?你相信你可以用'T'做的事情知道這一點,你不能這樣做嗎? –

+2

你爲什麼一直在改變這個問題? –

回答

7

您可以使用模板模板參數的基本模板,然後檢查是否T*可以轉換到一些Temp<Args...>

template <template <typename...> class Of, typename T> 
struct is_base_instantiation_of { 
    template <typename... Args> 
    static std::true_type test (Of<Args...>*); 
    static std::false_type test (...); 

    using type = decltype(test(std::declval<T*>())); 
    static constexpr auto value = type::value; 
}; 

Live Demo

+0

您的現場演示無法編譯... – Cornstalks

+3

@Cornstalks我相信這就是'int '不從'MyParentClass'模板類派生(因此'enable_if_t'失敗並確保'MyClass'不是'MyClass '的重載分辨率的一部分)。 – dfri

+0

@dfri:啊,你說得對。我誤解了它。對錶示「彙編將在此失敗」的兩行的評論將有助於明確故障是故意的。 – Cornstalks

3

您可以使用自定義特徵,以檢查是否類型是從模板派生的。然後用這個性狀的static_assert內:

#include <type_traits> 

template <template <typename...> class T, typename U> 
struct is_derived_from_template 
{ 
private: 
    template <typename... Args> 
    static decltype(static_cast<const T<Args...>&>(std::declval<U>()), std::true_type{}) test(
      const T<Args...>&); 
    static std::false_type test(...); 

public: 
    static constexpr bool value = decltype(test(std::declval<U>()))::value; 
}; 


template <typename T1, typename T2> 
struct MyParentClass 
{ 
}; 

template<typename T> 
struct MyClass 
{ 
    static_assert(is_derived_from_template<MyParentClass, T>::value, "T must derive from MyParentClass"); 
}; 


struct DerivedFromMyParentClass : MyParentClass<int, float>{}; 

struct Foo{}; 

int main() 
{ 
    MyClass<DerivedFromMyParentClass> m; 
    MyClass<Foo> f; 
} 

live example

相關問題