2016-06-21 109 views
0

我将在一个例子来解释:传递指针的类型作为模板参数

template<typename T> 
class Base{} 

class A: public Base<A>{} 

class foo(){ 
public: 
    template<typename T> 
    bool is_derived(){ 
     /* static check if T is derived from Base<T> */ 
    } 
} 

我发现this性状以确定一个类是否是另一个的基座。

我的问题是,如果T是一个指针而没有专门的boo模板函数,我怎么能从T发送模板参数到is_base_of?

我想要做的是这样的:如果 T是一个指针,然后if (is_base_of<Base<*T>,*T>) return true; 如果T是不是指针,然后if (is_base_of<Base<T>,T>) return true;

+2

的std :: is_base_of :: type> –

+0

或者简单的'std :: is_ba se_of >'in C++ 14。 –

+0

它可以是基地还是必须是基地? – Loay

回答

1

您可以使用std::remove_pointer性状:

class foo(){ 
public: 
    template<typename T> 
    bool is_derived() const { 
     using type = std::remove_pointer_t<T>; 
     static_assert(std::is_base_of<Base<type>, type>::value, 
        "type should inherit from Base<type>"); 
    } 
}; 
+0

谢谢,那为我解决了。在一个侧面说明,为什么我不能做type = std :: remove_pointer_t ; “使用关键字指示什么?” – Loay

+0

它是'typedef std :: remove_pointer_t 类型的C++ 11'typedef'语法;' – Jarod42

+0

没有这个快捷方式,你必须写'std :: is_base_of >,std :: remove_pointer_t > :: value' – Jarod42

0

基本上你已经回答了你自己。

C++ 14

bool is_derived(){ 
    static_assert(std::is_base_of<Base<T>, std::remove_pointer_t<T>>::value); 
} 

C++ 11

bool is_derived(){ 
    static_assert(std::is_base_of<Base<T>, typename std::remove_pointer<T>::type>::value); 
} 

C++ 03 - 包装过你提到is_base_of(使用Boost.StaticAssert

template<class Base, class Derived> struct my_is_base_of : is_base_of<Base, Derived> { }; 
template<class Base, class Derived> struct my_is_base_of<Base*, Derived*> : is_base_of<Base, Derived> { }; 

// ... 

bool is_derived(){ 
    BOOST_STATIC_ASSERT(my_is_base_of<Base<T>, T>::value); 
} 
+0

您忘记了':: value',static_assert的第二个参数(至少对于C++ 11),并且'static_assert'在C++ 03。 – Jarod42

+0

@ Jarod42纠正了这一点。谢谢。 –

相关问题