C++ Templates 的另类用法

原创 2004年12月29日 12:04:00
先来看一看下面这个 template. 

extern "C++" // templates cannot be declared to have 'C' linkage
template <typename T, size_t N>
char (*RtlpNumberOf( UNALIGNED T (&)[N] ))[N];

想知道这个的template做什么用的吗?它的目的不是生成可调用的template function, 而且根本没有implement. 也没有任何人需要调用它。

你是否考虑过带类型检查的 ARRAYSIZE macro宏?
ARRAYSIZE 一般的定义是:
 #define ARRAYSIZE(x) (sizeof(x)/sizeof((x)[0]))



但是这个宏在下面代码中会带来灾难性的后果,而且编译器不会有 warning。
(though none will make this type of mistake in general regular_smile.gif )


Struct Foo { CHAR _ch[10]; };
Foo * pFoo;
ARRAYSIZE(pFoo); // will ==0

怎么解决呢?下面是从winnt.h中看到的:

// Attempts to pass pointers instead of arrays to this macro result in compile time errors.
// That is the point.
//
extern "C++" // templates cannot be declared to have 'C' linkage
template <typename T, size_t N>
char (*RtlpNumberOf( UNALIGNED T (&)[N] ))[N];


#define RTL_NUMBER_OF_V2(A) (sizeof(*RtlpNumberOf(A)))
……
#define ARRAYSIZE(A) RTL_NUMBER_OF_V2(A)

真是“没有做不到,只有想不到”。不过,这东西有点太Hack了。不看注释太难理解了,注释在下面了。

// RtlpNumberOf is a function that takes a reference to an array of N Ts.
//
// typedef T array_of_T[N];
// typedef array_of_T & reference_to_array_of_T;
//
// RtlpNumberOf returns a reference to an array of N chars.
//
// typedef char array_of_char[N];
// typedef T3 & reference_to_array_of_char;
//
// sizeof(array_of_char) == N
// sizeof(reference_to_array_of_char) == N
//
// reference_to_array_of_char RtlpNumberOf(reference_to_array_of_T);
//
// We never even call RtlpNumberOf, we just take the size of its return type.
// We do not even implement RtlpNumberOf, we just decare it.
//


以上是我自己的理解,不知道是不是正确,欢迎讨论。

C++ 高级篇(一)—— 模板(Templates)

模板(Templates)是ANSI-C++ 标准中新引入的概念。如果你使用的 C++ 编译器不符合这个标准,则你很可能不能使用模板。     函数模板( Function templates) ...
  • zqixiao_09
  • zqixiao_09
  • 2016年05月22日 12:44
  • 14724

Intellij IDEA中通过Live Templates快速生成一段固定格式的代码,如:文本注释等。

在Intellij IDEA中,如果想要快速生成一段代码,比如如下代码。 /** * Created with IntelliJ IDEA * Created by ustcck on 2016...
  • ck4438707
  • ck4438707
  • 2016年10月30日 23:12
  • 2672

善用Eclipse的代码模板(Templates)功能

Eclipse是个非常强大的IDE,作为一个JAVA程序员,几乎每天都与它打交道,但是它强大的功能都用到了吗? 今天让我们来看一下Eclipse中的“代码模板”功能。什么是代码模板呢?举个例子,...
  • PapperMan
  • PapperMan
  • 2016年05月18日 23:57
  • 1228

android sqlite另类用法(对象存取)

在andorid端使用sqlite数据库是经常的是,通常来说都是对每个属性对应一个字段,然后分字段的来读取,但是今天我要说的不是这样的。我们通过对象序列化来存取。因为一个好的程序员总是得学会偷懒。 D...
  • shengbo1992
  • shengbo1992
  • 2014年07月05日 22:14
  • 1633

推荐|Attention的另类用法(by Colin Raffel)

——免费加入AI技术专家社群>> ——免费加入AI高管投资者群>> ——日薪5k-10k招兼职AI讲师>> --全国招募1000名AI推广大使>> 《Doing Strange T...
  • CygqjBABx875u
  • CygqjBABx875u
  • 2017年11月28日 00:00
  • 51

WebService另类用法之一,运维

WebService的运维用法经验。
  • xiaoyw
  • xiaoyw
  • 2016年01月25日 22:43
  • 601

Drools的另类用法--模板使用,以及与Spring集成

简述 Drools的用法非常多,功能也非常强大,本文不讨论具体语法以及使用,主要分享一下在使用过程中一种比较另类的思路,由于本人未使用过Drools历史版本,故没有对比,所有讨论都基于Drools ...
  • xh16319
  • xh16319
  • 2017年05月19日 11:17
  • 967

Rpm另类用法加固Linux安全

Rpm另类用法加固Linux安全   RPM是Red Hat Package Manager的缩写即Red Hat软件管理器。它是一个开放的包管理软件,由Red Hat公司所开发和维护...
  • lcgweb
  • lcgweb
  • 2014年05月19日 19:13
  • 338

androidsdk另类用法使模拟器更快

转载请注明出处: LouisWang http://blog.csdn.net/louiswangbing/article/details/6606865 这是观看博客时候看到的,找个时间...
  • dantengkengdie
  • dantengkengdie
  • 2013年12月07日 00:40
  • 584

AccessibilityService辅助类用法(Android 中的另类钩子)

说在前面的话为什么会把AccesiibilistyService叫做Android 中的另类钩子呢?搞过windows的都知道,钩子的含义就是能够监听到一切你想监听的内容,而Android中的Acce...
  • shengbo1992
  • shengbo1992
  • 2015年07月27日 13:34
  • 3738
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ Templates 的另类用法
举报原因:
原因补充:

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