让gcc支持成员函数模板的trick
Posted 飘飘白云
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了让gcc支持成员函数模板的trick相关的知识,希望对你有一定的参考价值。
让gcc支持成员函数模板的trick
罗朝辉 (http://blog.csdn.net/kesalin/)
本文遵循“ 署名-非商业用途-保持一致”创作公用协议 gcc 4.7.3 不支持成员函数模板特化。如下代码:#ifndef __MEMFUNTEMPLATE_H__ #define __MEMFUNTEMPLATE_H__
#include <stdio.h>
class Base ; class Derived : public Base ;
struct Functor template <typename T> void function() printf(" Primary template .\\n");
template<> void function< int >() printf(" Specialization for int .\\n");
template<> void function<Base *>() printf(" Specialization for Base * .\\n"); ;
class Tester public : static void DoTest() Functor functor; functor.function< char >(); functor.function< int >(); functor.function<Base *>(); functor.function<Derived *>(); ;
#endif // __MEMFUNTEMPLATE_H__
在 VS2010 中编译运行是没有问题的,但在 gcc 4.7.3下,编译都通不过:
为了达到近似成员函数模板特化的效果,可以利用成员函数主模板以及重载函数来实现:
/* * MemFunTemplate.h * * Created on: Jul 12, 2013 * Author: http://blog.csdn.net/kesalin/ */
#ifndef MEMFUNTEMPLATE_H_ #define MEMFUNTEMPLATE_H_ #include <stdio.h> template<typename T> struct DummyIdentity typedef T type; ; class Base ; class Derived : public Base ; struct Functor template <typename T> void function() function(DummyIdentity<T>()); private : template <typename T> void function(DummyIdentity<T>) printf(" Primary template DummyIdentity<T> .\\n"); void function(DummyIdentity< int >) printf(" overload function for DummyIdentity<int> .\\n"); void function(DummyIdentity<Base *>) printf(" overload function for DummyIdentity<Base *> .\\n"); ; class Tester public : static void DoTest() Functor functor; functor.function< char >(); functor.function< int >(); functor.function<Base *>(); functor.function<Derived *>(); ; #endif /* MEMFUNTEMPLATE_H_ */
调用 DoTest() 运行结果如下:
注意:
VS2010 版本的代码,模板形参为 T,在实例化不会进行隐式类型转换。即用 Derived * 当作实参调用的是主模板,而不是 Base * 特化版本
而在 gcc 下,模板形参虽然也为T,但影响重载决议的 function 参数为:DummyIdentity<T>,用不同的实际参数实例化该模板,得到的是一堆重载函数。因此用 Derived * 当作实参时,调用的函数自然就是实例化的 void function(DummyIdentity<T>)了。
以上是关于让gcc支持成员函数模板的trick的主要内容,如果未能解决你的问题,请参考以下文章