混淆继承和模板

问题描述:

这是我一直在寻找的代码,Source code混淆继承和模板

template <typename T> 
struct function_traits 
    : public function_traits<decltype(&T::operator())> 
{}; 

如果我们有一些仿Xfunction_traits<X>;实例化,这将筑基类,这是function_traits<decltype(&X::operator())>因继承,但建立function_traits<decltype(&X::operator())>它的基地也必须建立,这可能是function_traits<decltype(Z)>

据我所知function_traits<X>!= function_traits<Z>。这不是递归继承吗? 0_o。 所有事情如何一起工作?

+0

当你尝试时会发生什么? – 2011-12-21 21:11:53

+0

我不明白你的问题是什么。这不是没有'function_traits'的成员函数指针的其他专门化的有效代码。 – ildjarn 2011-12-21 21:15:38

+0

@FreakEnum:是的,该代码包含我所指的确切的专业化。 ; - ] – ildjarn 2011-12-21 21:28:45

这是非法的代码。你不能从一个不完整的类型派生出来,并且在你尝试从function_traits得出的点上,类型是不完整的。

struct A { typedef A type; }; 
struct B { typedef A type; }; 

template <typename T> 
struct X : X<typename T::type> {}; 

X<B> test; // error: invalid use of incomplete type ‘struct X<A>’ 

你可以避开这个问题的唯一方法是,如果function_traits你正试图从推导是一个完整的类型。为此,您可以使用专业化:

struct A { typedef A type; }; 
struct B { typedef A type; }; 

template <typename T> 
struct X : X<typename T::type> {}; 

template <> 
struct X<A> {}; // X<A> is now a complete type. 

X<B> test; // OK! Derives from X<A>, which is complete. 

这里,X<A>完毕后,您试图从中得到,所以你的罚款。

+0

这里是整体如果你可能想看看http://github.com/kennytm/utils/blob/master/traits.hpp – 2011-12-21 21:25:55

+1

@FreakEnum:正如你所看到的,他专门为第一个下面的各种类型的功能模板定义,所以他总是有一个完整的课堂。我相信KennyTM会回答你有任何其他问题:-) http://*.com/users/224671/kennytm – 2011-12-21 21:32:14

+0

现在,这对我来说是有道理的。谢谢:) – 2011-12-22 09:14:59