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://www.js-code.com/cpp/cpp_58471.html