C++的模板太有魔性了,根本就是一个编译期语言。不过要做到好用,有用,又不产生垃圾代码确实困难。
虽然还没领悟到精髓,但是以下几个用法个人感觉还是挺不错的。
成员函数扩充
在Go中可以很容易地给任意类型增加方法
type Integer int
func (a Integer) Less(b Integer) bool {
return a < b
}
感觉这个特性十分方便,于是用模板实现了一个类似的功能。
class Binary: public std::vector<unsigned char>
{
public:
template<typename T>
bool convertTo(T& value)
{
return false;
}
};
template<>
inline bool Binary::convertTo(String& value)
{
for (auto c : *this)
value.push_back(c);
return true;
}
上面的例子中,首先定义了原始数据类型Binary
,要读取其中的内容就需要写一个从Binary
到特定类型的转换函数。
利用模板特化我们可以将成员函数的实现放在任意位置,且不用修改原来类的定义。
编译期报错
只要在泛型模板里面写入错误的代码。ERROR不需要定义。
class Binary: public std::vector<unsigned char>
{
public:
template<typename T>
bool convertTo(T& value)
{
//throw error
ERROR("undefined convert Type");
return false;
}
};
这样一来一旦有人尝试转换成未定义的类型,编译的时候就会报错。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。