使用boost::enable_if与boost::type_traits在模板中实现对模板类型的接口的限制
2014-03-01 20:46
344 查看
直上源码:
现在越来越感觉到设计的重要性,良好的设计让代码不失简洁又不会带来为了简洁而简洁导致的额外负担
当我们处于一个流程化的世界的时候,却把关注点集中于对现实世界物件的模拟,却忘了对流程的处理才是本质的需求
勿因设计而设计,因需要而设计,面向对象滥用则不如不用。
#include <cstdio> #include <iostream> #include <boost/utility.hpp> #include <boost/type_traits.hpp> struct IHello { virtual void Hello() = 0; }; struct CHello:public IHello { virtual void Hello() { std::cout<<"Hello World"<<std::endl; } }; struct NoHello { void Hello() { std::cout<<"No Hello World"<<std::endl; } }; //此处要求T必须是继承自IHello template<typename T> void ShowHello(T* shower) { typedef boost::enable_if<boost::is_base_of<IHello,CHello>,IHello>::type HelloType; HelloType* hell_shower = shower; hell_shower->Hello(); } int main(int argc,char** argv) { CHello hello; ShowHello(&hello); //不是继承自IHello,则编译无法通过 NoHello no_hello; ShowHello(&no_hello); return 0; }代码写得比较简单,主要是为了验证想法,C++有了boost和0x标准,越来越强大。
现在越来越感觉到设计的重要性,良好的设计让代码不失简洁又不会带来为了简洁而简洁导致的额外负担
当我们处于一个流程化的世界的时候,却把关注点集中于对现实世界物件的模拟,却忘了对流程的处理才是本质的需求
勿因设计而设计,因需要而设计,面向对象滥用则不如不用。
相关文章推荐
- 用模板template<typename T>实现int double等类型转string
- JavaScript的String类型replace()方法介绍和使用replace()方法实现简单html模板替换功能
- 非类型模板参数限制——不可以使用内部链接对象
- 用模板template<typename T>实现int double等类型转string
- 使用序列化接口Parcelable、Serializable实现Activity间传递复杂数据类型参数
- 关于类型判断符is和迭代器接口实现中yield return的使用
- Android开发:使用序列化接口Parcelable、Serializable实现Activity间传递复杂数据类型参数
- error C2027: 使用了未定义类型 std::basic_ifstream<_Elem,_Traits>
- C++ - 非类型模板参数(nontype template parameters) 使用 及 代码
- 模板 traits的一个经典例子 , 解决 void func(T t)根据t的类型不同来做不同的实现
- hibernate中自定义数据类型的使用---UserType,CompositeUserType接口的使用
- 使用模板消息实现微信消息推送,突破48小时限制
- C++ - 非类型模板参数(nontype template parameters) 使用 及 代码
- C++模板中type_traits(类型特化)
- 利用类型萃取(Traits)限制函数模版具体化所使用的类型
- C++ - 非类型模板参数(nontype template parameters) 使用 及 代码
- 4-4 求自定类型元素的平均 (10分) 本题要求实现一个函数,求N个集合元素S[]的平均值,其中集合元素的类型为自定义的ElementType。 函数接口定义: ElementType Aver
- 将任意类型映射到一个唯一整数(C++模板实现TypeList)
- 使用集合接口的时候应该使用通用类型代替具体的实现类型
- 如何使用反射确定一个属性是否实现了IList接口,如何确定元素量为空的集合的元素类型。