`
dawuafang
  • 浏览: 1106856 次
文章分类
社区版块
存档分类
最新评论

让gcc支持成员函数模板的trick

 
阅读更多

让gcc支持成员函数模板的trick

罗朝辉 (http://blog.csdn.net/kesalin/)

本文遵循“署名-非商业用途-保持一致”创作公用协议
gcc 4.7.3 不支持成员函数模板特化。如下代码:

#ifndef__MEMFUNTEMPLATE_H__
#define__MEMFUNTEMPLATE_H__

#include<stdio.h>

classBase{};
classDerived:publicBase{};

structFunctor{
template<typenameT>voidfunction(){
printf("Primarytemplate.\n");
}

template<>
voidfunction<int>(){
printf("Specializationforint.\n");
}

template<>voidfunction<Base*>(){
printf("SpecializationforBase*.\n");
}
};

classTester{
public:
staticvoidDoTest()
{
Functorfunctor;
functor.function<char>();
functor.function<int>();
functor.function<Base*>();
functor.function<Derived*>();
}
};

#endif//__MEMFUNTEMPLATE_H__

在 VS2010 中编译运行是没有问题的,但在 gcc 4.7.3下,编译都通不过:

../src/MemFunTemplate.h:21:14:error:<strong>explicitspecializationinnon-namespacescope</strong>‘structFunctor’
../src/MemFunTemplate.h:22:24:error:template-id‘function<int>’indeclarationofprimarytemplate
../src/MemFunTemplate.h:26:14:error:explicitspecializationinnon-namespacescope‘structFunctor’
../src/MemFunTemplate.h:26:38:error:template-id‘function<Base*>’indeclarationofprimarytemplate
../src/MemFunTemplate.h:26:21:error:‘voidFunctor::function()’cannotbeoverloaded
../src/MemFunTemplate.h:22:10:error:with‘voidFunctor::function()’
../src/MemFunTemplate.cpp:Infunction‘intmain()’:
../src/MemFunTemplate.cpp:17:2:error:‘DoTest’isnotamemberof‘Functor’


为了达到近似成员函数模板特化的效果,可以利用成员函数主模板以及重载函数来实现:


/*
*MemFunTemplate.h
*
*Createdon:Jul12,2013
*Author:http://blog.csdn.net/kesalin/
*/

#ifndefMEMFUNTEMPLATE_H_
#defineMEMFUNTEMPLATE_H_
#include<stdio.h>
template<typenameT>
structDummyIdentity{
typedefTtype;
};
classBase{};
classDerived:publicBase{};
structFunctor{
template<typenameT>voidfunction(){
function(DummyIdentity<T>());
}
private:
template<typenameT>
voidfunction(DummyIdentity<T>){
printf("PrimarytemplateDummyIdentity<T>.\n");
}
voidfunction(DummyIdentity<int>){
printf("overloadfunctionforDummyIdentity<int>.\n");
}
voidfunction(DummyIdentity<Base*>){
printf("overloadfunctionforDummyIdentity<Base*>.\n");
}
};
classTester{
public:
staticvoidDoTest()
{
Functorfunctor;
functor.function<char>();
functor.function<int>();
functor.function<Base*>();
functor.function<Derived*>();
}
};
#endif/*MEMFUNTEMPLATE_H_*/


调用 DoTest() 运行结果如下:

PrimarytemplateDummyIdentity<T>.
overloadfunctionforDummyIdentity<int>.
overloadfunctionforDummyIdentity<Base*>.
PrimarytemplateDummyIdentity<T>.


注意:

VS2010 版本的代码,模板形参为 T,在实例化不会进行隐式类型转换。即用Derived * 当作实参调用的是主模板,而不是 Base * 特化版本

而在 gcc 下,模板形参虽然也为T,但影响重载决议的 function 参数为:DummyIdentity<T>,用不同的实际参数实例化该模板,得到的是一堆重载函数。因此用Derived * 当作实参时,调用的函数自然就是实例化的void function(DummyIdentity<T>)了。

分享到:
评论

相关推荐

    GCC下C语言函数大全

    GCC下C语言函数大全,以及如何使用。文件格式为html格式.

    GCC.rar_GCC-ML matlab_GCC加权函数_PHAT加权_互相关 加权_互相关函数

    广义互相关函数,包含所有互相关的权函数,可以方便的使用它,其中PHAT加权效果最好!

    gcc 函数调用探测功能

    收集一个函数调用的踪迹,一种方法是通过在函数的入口处和出口处插入一个打印语句来检测。这个过程非常繁琐,而且很容易...幸运的是,GNU 编译器工具链(也称为 gcc)提供了一种自动检测应用程序中的各个函数的方法。

    gcc编译时pow函数编译的问题及解决

    gcc编译时出现异常,发现pow函数找不到。 对该编译问题的解决办法总结

    GCC-PHAT.zip

    根据加权函数的不同,广义互相关函数有多种不同的变形,其中广义互相关-相位变换方法(Generalized Cross Correlation PHAse Transformation,GCC-PHAT)方法应用最为广泛。GCC-PHAT方法本身具有一定的抗噪声和抗...

    gcc manual gcc手册

    gcc manual gcc手册 gcc manual gcc手册 gcc manual gcc手册 gcc manual gcc手册

    STM32的GCC工程模板

    基于GCC的STM32F1工程模板,可在Linux下编译,编译时需要安装arm-none-eabi-gcc编译器。

    GD32F407-GCC编译模板,包含配置文件

    在vscode下使用armgcc编译gd32f407程序,包含相关配置文件,经过测试可以下载、调试。

    gcc、gcc++ 离线安装包

    gcc、gcc++ 离线安装包

    gcc各版本文档.rar

    gcc各版本文档,具体包括: gcc11_2、gcc10_3、gcc9_4、gcc8_5、gcc7_5、gcc6_5、gcc5_5、gcc4_9_4、gcc4_8_5、gcc4_7_4、gcc4_6_4、gcc4_5_4、gcc4_4_7、gcc4_3_6、gcc4_2_4、gcc4_1_2、gcc4_0_4、gcc3_4_6

    离线安装GCC与GCC-C++

    离线安装GCC与GCC-C++

    ARM汇编器与GCC汇编器支持的汇编语言差别

    ARM汇编器与GCC汇编器支持的汇编语言差别

    gcc前端的内部结构

    言,COBOL 语言,以及支持函数式编程和逻辑编程的 Mercury 语言,等等。而 GCC 也不再单只是 GNU C 语言编译器的意思了,而是变成了 GNU Compiler Collection 也即是 GNU 编译器家族的意思了。

    gcc和gcc-c++离线安装包

    从mini安装版centos7.5提取出来的gcc和gcc-c++安装包,下载后放到服务器解压,并cd到该目录,执行 rpm -Uvh *.rpm,安装完成后,运行gcc -v,g++ -v,会出现版本信息,则完成

    GCC手册 包含GCC的各种参数讲解

    自己整理的GCC手册,包含GCC的各种参数讲解,不同环境下的makefile的写法,希望对大家有帮助.

    离线安装升级gcc,gcc版本9.2

    1.最近有离线安装redis6+的需要,同样Redis离线构建依赖于gcc高版本; 2.内含gcc的依赖,总结的构建命令; 3.gcc构建过程极其耗时1h+; 4.gcc构建存储空间6G+,虚拟机的小伙伴注意剩余存储空间,免走我的空间问题的...

    GCC-AVR函数库.pdf

    有关创新创业的演讲稿创新创演讲稿范文推荐.pdf

    gcc编译器常识介绍

    从程序员的角度看,只需简单地执行一条GCC命令就可以了,但从编译器的角度来看,却需要完成一系列非常繁杂的...第一步是进行预编译,使用-E参数可以让GCC在预处理结束后停止编译过程: # gcc -E hello.c -o hello.i

    GCC 函数lib的类型及优缺点

    GCC 论述gcc当中lib库 以及各种lib库的优缺点

    gcc技术手册 for GCC 4.5.3

    gcc技术手册 for GCC 4.5.3

Global site tag (gtag.js) - Google Analytics