混淆继承和模板
这是我一直在寻找的代码,Source code:混淆继承和模板
template <typename T>
struct function_traits
: public function_traits<decltype(&T::operator())>
{};
如果我们有一些仿X
即function_traits<X>;
实例化,这将筑基类,这是function_traits<decltype(&X::operator())>
因继承,但建立function_traits<decltype(&X::operator())>
它的基地也必须建立,这可能是function_traits<decltype(Z)>
据我所知function_traits<X>
!= function_traits<Z>
。这不是递归继承吗? 0_o。 所有事情如何一起工作?
这是非法的代码。你不能从一个不完整的类型派生出来,并且在你尝试从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>
完毕后,您试图从中得到,所以你的罚款。
这里是整体如果你可能想看看http://github.com/kennytm/utils/blob/master/traits.hpp – 2011-12-21 21:25:55
@FreakEnum:正如你所看到的,他专门为第一个下面的各种类型的功能模板定义,所以他总是有一个完整的课堂。我相信KennyTM会回答你有任何其他问题:-) http://*.com/users/224671/kennytm – 2011-12-21 21:32:14
现在,这对我来说是有道理的。谢谢:) – 2011-12-22 09:14:59
当你尝试时会发生什么? – 2011-12-21 21:11:53
我不明白你的问题是什么。这不是没有'function_traits'的成员函数指针的其他专门化的有效代码。 – ildjarn 2011-12-21 21:15:38
@FreakEnum:是的,该代码包含我所指的确切的专业化。 ; - ] – ildjarn 2011-12-21 21:28:45