澄清模板功能专业化

时间:2010-11-22 10:26:37

标签: c++ templates template-specialization function-templates

我想创建一个计算器

template < typename T >
class Calculator
{
    public :
    Calculator ( void );
    ~Calculator ( void );

    T add(T a, T b)
    {
       return ( a + b ) ;
    }
};

现在我想让这个Caculator添加字符串,所以add(“Tim”,“Joe”)会给我“TimJoe”。

我是否可以通过对现有类进行必要的更改来使用模板函数专门化来实现此目的。

3 个答案:

答案 0 :(得分:4)

如果您使用std::string,则根本不需要处理模板专业化:

Calculator<std::string> calc;
std::string result = calc.add("Tim", "Joe");
// result contains "TimJoe"

事实上,由于标准库的“神奇”,你可以做到这一点,而不必写出另一个类。

我会通过add() const T&接受参数来修改您的模板类:

template < typename T >
class Calculator
{
public :
    Calculator() {};
    ~Calculator() {};

    // Note that we're taking in parameters by const T&
    // to avoid copies if instances of T are large.
    T add(const T& a, const T& b)
    {
        return ( a + b ) ;
    }
};

答案 1 :(得分:3)

你为什么要这样做?

Calculator<std::string> a;
std::cout << a.add("Hello", " world") << std::endl;

此代码输出“Hello world”。它不是最优的(std::string成员函数中的add参数是按值获取的),但它不需要专门化来工作。

编辑好的,你想要专业化,但你不能只专门化add成员函数,因为该函数本身不是模板。你可以专门研究整个班级:

template<>
class Calculator<std::string>
{
public :
    Calculator() {}
    ~Calculator() {}

    std::string add(const std::string &a, const std::string &b)
    {
        // Do std::string specific stuff
        return a + b ;
    }
};

或制作add成员函数模板并将其专门化:

class Calculator
{
public :
    Calculator () {}
    ~Calculator () {}

    template<class T>
    T add(T a, T b)
    {
       return a + b;
    }
};

template<>
std::string Calculator::add<std::string>(std::string a, std::string b)
{
    // Do std::string specific stuff
    return a + b ;
}

使用第二个解决方案,单个Calculator实例将能够添加intstd::string或您需要的任何内容(因为它是模板的add函数,而不是Calculator类本身。)

答案 2 :(得分:1)

这是可能的(即使在这种情况下对于字符串不是必要的,如@icecrime和@In silico已经提到的那样)

这是您可以专门化您的会员功能的方式:

#include <iostream>
#include <string>

using namespace std;

template < typename T >
class Calculator
{
    public :
    Calculator () {}
    ~Calculator () {}

    T add(const T& a, const T& b);
};

template <typename T>
T Calculator<T>::add(const T& a, const T& b)
{
    return (a + b);
}

template <>
string Calculator<string>::add(const string& a, const string& b)
{
    return (a + " " + b);
}

int main()
{
    Calculator<string> ccs;
    cout << ccs.add("a", "b") << endl;

    Calculator<int> cci;
    cout << cci.add(1, 2);
}

输出结果为:

a b
3

请注意,它仍然按照您的预期运行,因此您不能这样做:

    Calculator<int> cci;
    cout << cci.add("a", "b");