首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

typedef 跟 模板 可混用吗

2013-11-29 
typedef 和 模板 可混用吗?两个问题。问题一:假设有一个模板类这有void的,有(int,char *)好像形参表之类的

typedef 和 模板 可混用吗?
两个问题。
问题一:
假设有一个模板类


这有void的,有(int,char *)好像形参表之类的东西为什么是类型..乍一看以为是函数
请大神解释。 typedef 模板
[解决办法]
template<class T> struct A 
{   T data; }   

typedef A<T> * pA //T应该是具体的类型比如int
int *(*a[5])(int, char*); //函数指针数组,保存的函数类型为返回int*,以int*及 char为参数
void (*b[10]) (void (*)()); //指针数组。函数是以另一个函数指针做参数
double(*)() (*pa)[9]; //这个不懂





[解决办法]
问题一:根据C++11的说法,之前的标准不允许使用typedef给模板取别名,但有些编译器上经常看到类似的效果(应该是编译器自己实现的),新标准中用using给模板取别名。比如:
template <class T>
using My_vec = std::vector<T>;
VS2012好像还没支持这功能,gcc下未测试,有待验证。

问题二:都是函数指针而已,第一个是函数指针数组。第二个一样是函数指针数组,只是这些函数的参数也是函数指针。第三个是函数指针的二维数组。以第一个为例:
#include<iostream>
#include <vector>
using namespace std;

typedef int *(*a[5])(int, char*);

int * f(int i,char* ch){
cout<<i<<" ff "<<ch<<endl;
int * p = (int*)malloc(sizeof(int));
return p;
}

int * g(int i,char* ch){
cout<<i<<" gg "<<ch<<endl;
int * p = (int*)malloc(sizeof(int));
return p;
}

int main()
{
a p={f,g};
int* p1 = p[0](1,"1");
int* p2 = p[1](2,"2");
return 0;
}

[解决办法]
引用:
第三个是数组指针,可以看下这个例子(虽然有点糟糕):
#include<iostream>
#include <vector>

typedef double(* dfp)();
typedef dfp (*pa)[9]; 

double f(){
cout<<" ff "<<endl;
return 1.1;
}
double g(){
cout<<" gg "<<endl;
return 1.1;
}


int main()
{
pa a;
a=(pa)malloc(sizeof(dfp));
a[0][0]=f;
a[0][3]=g;
a[0][0]();
a[0][3]();
return 0;
}

这个代码不错,可惜发生了越界访问。用这句代码即可看出申请到的空间只是4bytes。
cout<<sizeof(dfp)<<endl;

我冒昧修改了一下。
#include<iostream>
using namespace std;

typedef double(* Function)();//函数类型
typedef Function (*FunctionArrayPointer)[9]; //指向一维数组的指针,数组元素为函数指针

double f(){
cout<<" ff "<<endl;
return double();
}
double g(){
cout<<" gg "<<endl;
return double();
}

int main()
{
Function FunctionArray[1][9] ;
FunctionArrayPointer pArray =  FunctionArray ;
pArray[0][0]=f;
pArray[0][1]=g;
pArray[0][0](  );
pArray[0][1](  );
return 0;
}
[解决办法]
唉,这种复杂的语法,目前还没见过用在哪个地方过呢,下面是我的理解,抛砖引玉,仅供参考

(1)int *(*a[5])(int, char*)
写成这样应该好理解些:int* (*a[5])(int, char*)
其中左边的int*和右边的(int, char*)共同说明了一个函数类型,即参数类型为int和char*返回类型为int*的函数类型,再看中间的(*a[5]),这个表明它是元素个数为5的数组,所以连起来:
typedef int *(*a[5])(int, char*);
a array;//这里就是定义了一个数组array,这个数组中有5个元素,每一个都是一个函数指针,
        //且函数的参数类型为int和char*,返回类型为int*
(2)
void (*b[10]) (void (*)());
与(1)类似,左边的void和右边(void (*)())共同说明了一个函数类型,这种函数无返回值且参数是一个函数指针,这个函数指针指向的函数是一个无返回值且无参数的函数,中间的(*b[10])表示它是一个元素个数为10的数组,所以连起来:
typedef void (*b[10]) (void (*)());
b array;//这里就是定义了一个数组array,这个数组中有10个元素,每一个都是一个函数指针,
        //且函数无参数无返回值

注意,这里的void (*)()虽然在C++中理解成上述无参数无返回值的函数指针,但是在C中却可以是带任意参数无返回值的函数指针,且C语言标准保证函数指针解引用时参数的正确接收

(3)double(*)() (*pa)[9]
左边的double(*)()说明了一个函数类型,此函数无参数且返回值为double类型,右边的(*pa)[9]说明它是一个指针,这个指针指向一个含有9个元素的数组,所以连起来:
typedef double (*pFun)();


typedef pFun (*pa)[9];
pa p = NULL;//这里定义了一个指针,它需要指向一个数组,这个数组要含有9个元素,
            //且每个元素都是一个函数指针,函数无参数,返回值为double类型


[解决办法]


问题一:我已经说过了,VS下对C++11更新过慢,所以不一定有这个功能,你看看VS2013有没有这个功能,没有就没办法了。目前gcc下已经除了最小垃圾回收,其他的功能都已经支持了,你可以去试一下。不过具体怎么样用我没做测试,是否这样子我也不太清楚,你可以去查查标准。

问题二,其实这里是有点问题的,我其实想表达的是指向一维的行指针,但是因为一下子找不到这个类型,所以就用其他指针代替了,因为指针的大小都是一样的。至于为什么可以转成9*4byte,你理解可能有问题了。我申请的是第一维的,但这里的9*4是第二维的,这两者无关。

我是认为typedef dfp (*pa)[9]; 已经确定了第二维是 9*4 Byte了,所以只需要申请一维空间就可以了,但后面的高手说是有问题的,属于越界。不过我也觉得只申请一维的话就直接使用二维还是有问题的,最好不要这样使用。看看下面的写法吧。

热点排行