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;

このコードは「Helloworld」を出力します。これは最適ではありませんが(メンバー関数std::stringのパラメーターはadd値によって取得されます)、機能するために特殊化は必要ありません。

編集OK、特殊化が必要ですが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 ;
}

2番目のソリューションでは、単一のインスタンスで、、または必要なものCalculatorを追加できます(これは、クラス自体ではなく、テンプレートである関数であるため)。intstd::stringaddCalculator

于 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 に答える