C++编译期Constraints设计 (转载)
2010-11-19 13:23
260 查看
11月1日
C++编译期Constraints设计 (转载)
所谓的compile-time Constraints就是在编译期使用C++的语法规则对设计进行约束检查,尽量在编译期把程序的问题暴露出来,节省成本。
常用的规则:
1.大小为0的数组在编译期会报错
template
void check_size()
{
int dmp[sizeof(T1)==sizeof(T2)];
}
比如
check_size();//ok
check_size();//compile error:cannot allocate an array of constant size 0
2.不同类型的指针需要强制转换
以此可以用来判断两个对象是否有继承关系
template
void is_derived(T1 *pd =0 ,T2 *pb=0)
{
pb = pd;
}
比如:
is_derived() //compile failed
3.union的成员不能是非POD
union Test
{
std::string s; //illegal
};
这一点可以用来测试一个类型是否是POD
template
void check_pod()
{
union {
T data;
};
};
比如:
check_pod();//ok
check_pod();//failed
常用的技巧:
1.利用模板特化
Loki里面的例子
namespace Loki
{
template struct CompileTimeError;
template<> struct CompileTimeError{};
}
#define LOKI_STATIC_CHECK(expr, msg) /
{ Loki::CompileTimeError<((expr) != 0)> ERROR_##msg; (void)ERROR_##msg; }
利用特化来定制错误信息
2.利用空函数来实现0开销
编译器可能将空函数优化掉
3.利用enum无开销的取得编译期的所得到的整数值
Loki里面的例子:
template struct Length;
template <> struct Length
{
enum { value = 0 };
};
template
struct Length< Typelist >
{
enum { value = 1 + Length[u]::value };
};
C++编译期Constraints设计 (转载)
所谓的compile-time Constraints就是在编译期使用C++的语法规则对设计进行约束检查,尽量在编译期把程序的问题暴露出来,节省成本。
常用的规则:
1.大小为0的数组在编译期会报错
template
void check_size()
{
int dmp[sizeof(T1)==sizeof(T2)];
}
比如
check_size();//ok
check_size();//compile error:cannot allocate an array of constant size 0
2.不同类型的指针需要强制转换
以此可以用来判断两个对象是否有继承关系
template
void is_derived(T1 *pd =0 ,T2 *pb=0)
{
pb = pd;
}
比如:
is_derived() //compile failed
3.union的成员不能是非POD
union Test
{
std::string s; //illegal
};
这一点可以用来测试一个类型是否是POD
template
void check_pod()
{
union {
T data;
};
};
比如:
check_pod();//ok
check_pod();//failed
常用的技巧:
1.利用模板特化
Loki里面的例子
namespace Loki
{
template struct CompileTimeError;
template<> struct CompileTimeError
}
#define LOKI_STATIC_CHECK(expr, msg) /
{ Loki::CompileTimeError<((expr) != 0)> ERROR_##msg; (void)ERROR_##msg; }
利用特化来定制错误信息
2.利用空函数来实现0开销
编译器可能将空函数优化掉
3.利用enum无开销的取得编译期的所得到的整数值
Loki里面的例子:
template struct Length;
template <> struct Length
{
enum { value = 0 };
};
template
struct Length< Typelist >
{
enum { value = 1 + Length[u]::value };
};
相关文章推荐
- 【转载】 笔记--设计模式精解c++-GoF 23 种设计模式解析
- 转载:C++设计模式之Bridge模式 http://www.cnblogs.com/chain2012/archive/2011/01/17/1937528.html
- 转载:C++设计模式之Observer(观察者)模式 http://www.cnblogs.com/chain2012/archive/2011/01/24/1943322.html
- 转载:C++编译期多态与运行期多态
- (翻译)设计Qt风格的C++的应用程序接口 (转载)
- 设计模式——单键模式(singleton)C++实现 【转载】
- C++设计模式之Singleton模式 转载自:http://www.cnblogs.com/chain2012/archive/2011/01/10/1932055.html
- C++设计模式--享元模式【转载】
- (翻译)设计Qt风格的C++的应用程序接口【转载】
- C++设计模式(转载)
- C++ 高性能服务器网络框架设计细节(转载)
- (转载)你好,C++(16)用表达式表达我们的设计意图——4.1 用操作符对数据进行运算
- <转载> 设计模式精解c++-GoF 23 种设计模式解析
- [转载]教你理解复杂的C-C++声明
- 设计模式C++实现(7)——外观模式、组合模式
- 软件开发常用设计模式—单例模式总结(c++版)
- 设计模式学习(C++实现)5——原型模式
- C/C++通过COM调用.NET托管程序集的实现(转载)
- 给C++初学者的50个忠告(好文转载)
- C02-程序设计基础提高班(C++)第7周上机任务-指针