利用模板传递完整数组信息

原创 2007年09月29日 01:18:00
我们都知道,对于void doSomething(char buf[])而言,buf只是一个char*,对其求sizeof无法获得buf缓冲大小,有时候,尤其是需要验证缓冲是否大小合法的时候,获取数组完整信息是十分有必要的,而这要求sizeof获得的buf是直接的buf[]而不是char*,在我所知道的情况里,如果不用模板,我们总是传递的一个指针,而使用模板的时候,只有传递引用才可以获得正确的数组信息,为此我做了一个测试例子:
void    testa(char*    buf)
...{
    cout
<<"char pointer:"<<sizeof(buf)<<endl;
}


//void    testb(char*& buf)
//{
//    cout<<"char pointer reference:"<<sizeof(buf)<<endl;
//}

void    testc(char    buf[])
...{
    cout
<<"char array:"<<sizeof(buf)<<endl;
}


//compile error
//void    testd(char&    buf[])
//{
//    cout<<"char array reference:"<<sizeof(buf)<<endl;
//}

//void    teste(char[]    buf)
//{
//    cout<<"array:"<<sizeof(buf)<<endl;
//}
//
//void    testf(char[]&    buf)
//{
//    cout<<"array reference:"<<sizeof(buf)<<endl;
//}

template    
<class  T>
void    testg(T    buf)
...{
    cout
<<"template:"<<sizeof(buf)<<endl;
}


template    
<class T>
void    testh(T& buf)
...{
    cout
<<"template reference:"<<sizeof(buf)<<endl;
}


int _tmain(int argc, _TCHAR* argv[])
...{
    
char    t[100];
    testa(t);
    
//testb(t);
    testc(t);
    
//testd(t);
    
//teste(t);
    
//testf(t);
    testg(t);
    testh(t);
    
return 0;
}

 注释掉的部分是无法编译通过的,最后的运行结果是:

char pointer:4
char array:4
template:
4
template reference:
100

可以看到,确实只有template和reference的使用得到了我们想要的数据,而且,通过输出的数据我们可以看到,buf[]事实上在编译阶段也被认为是char*(testg),我们可以获取它的完整信息是因为使用引用模式时类型是完整的数据定义时候的样子,为了说明这个问题,我做如下修改:

template    <class T>
struct    NonExistStruct;

template    
<class  T>
void    testg(T    buf)
...{
    NonExistStruct
<T>();
    cout
<<"template:"<<sizeof(buf)<<endl;
}


template    
<class T>
void    testh(T& buf)
...{
    NonExistStruct
<T>();
    cout
<<"template reference:"<<sizeof(buf)<<endl;

涉及了两个模板方法,为了获取编译器替换阶段的信息,我故意定义了不存在的东西让编译器报错,得到的错误信息是:

//前者
error C2514: 'NonExistStruct<T>' : class has no constructors
1>        with
1>        [
1>            T=char *
1>        ]
//后者
error C2514: 'NonExistStruct<T>' : class has no constructors
1>        with
1>        [
1>            T=char [100]
1>        ]

这太形象了,只有在使用模板引用的时候,被传递了数组的原本模样。

一个完整的通过encoding/json信息传递格式,采用http.POST利用进行与服务器通信,并对返回结果进行解析处理的典型案例

package main import ( "fmt" "net/http" "encoding/json...

HTML5利用WebRTC的getUserMedia获取摄像头信息模拟拍照及视频(完整示例)

最近公司做的app关键是使用的问题,所以直接贴代码。

利用LocationManager获取经度,纬度等地理信息完整示例

MainActivity如下: package cc.bb; import java.util.Iterator; import java.util.List; import android.lo...
  • lfdfhl
  • lfdfhl
  • 2014年12月06日 13:19
  • 5133

以muppet为例利用模板方法模式增强异常信息的反馈

当你在定义方法时,应该保证此方法的正确性,但是你不能保证你的方法的调用者,他们的输入数据,或者     使用环境的正确性,当客户端代码调用此方法时,我们应该向调用方声明可能出现的异常,这样当出现 ...

利用POI将数据库表结构信息导入excel模板中

周末闲来无事,想工作中经常要导出数据库的表信息到excel作为文档使用,琢磨一下,用poi来根据固定的模板导出一个excel数据表信息,这个类非原创,但是有所加工改进,写给大家分享。所需的poi核心j...

二维数组,二维vector的声明初始化,&传递(iter,模板,C99特性),iterator遍历

/* program: iterator pass str compile: g++ main.cpp */ #include #include #include #inclu...

<java>利用简单一维数组完成信息的增删改查

具体实现如下,刚学到这边写着玩的,本人小白,高手请指点: import java.util.*; class Student{ int[] bianhao = new int[1024]; in...

一组新的多维数组模板类

  • 2006年03月16日 00:00
  • 12KB
  • 下载

用数组存放栈元素的栈类模板

  • 2010年10月26日 09:41
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用模板传递完整数组信息
举报原因:
原因补充:

(最多只允许输入30个字)