2

我想创建一个计算器

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

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

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

我可以通过对现有类进行必要的更改来使用模板函数专业化来实现这一点吗?

4

3 回答 3

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 ) ;
    }
};
于 2010-11-22T10:30:24.873 回答
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类本身)。

于 2010-11-22T10:31:25.397 回答
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");
于 2010-11-22T10:42:22.357 回答