3

したがって、テンプレート化されたクラスがあり、charなどの特定の型がある場合に関数の動作をオーバーロードしたいと考えています。他のすべてのタイプについては、彼らに自分のことをさせてください。ただし、c++ では関数をオーバーロードできません。

この関数をオーバーロードできないのはなぜですか? クラス全体を複製してしまうので、テンプレートの特殊化は本当にしたくありません

問題を示すおもちゃの例を次に示します: http://codepad.org/eTgLG932

あなたの読書の楽しみのためにここに投稿された同じコード:

#include <iostream>
#include <cstdlib>
#include <string>

struct Bar
{
  std::string blah() { return "blah"; }
};

template <typename T>
struct Foo
{
public:
  std::string doX()
  {
    return m_getY(my_t);
  }

private:
  std::string m_getY(char* p_msg)
  {
    return std::string(p_msg);
  }

  std::string m_getY(T* p_msg)
  {
    return p_msg->blah();
  }

  T my_t;
};

int main(int, char**)
{
  Foo<char> x;
  Foo<Bar> y;
  std::cout << "x " << x.doX() << std::endl;
  return EXIT_SUCCESS;
}

ご提案いただきありがとうございます。2 つの有効なソリューションが提示されています。doX メソッドを特化するか、m_getY() メソッドを特化することができます。

結局のところ、私は自分の専門分野を公開するよりも非公開にしておくことを好むので、クリルの答えを受け入れています.

4

4 に答える 4

7

クラス全体を特殊化せずに、テンプレート クラス全体から 1 つの関数だけを特定の型に特殊化できます。次のようになります。

template <> void Foo<char>::doX() {
     /* custom implementation here */
}

これを実際に目にすることはめったにありませんが、これは完全に正当な C++ コードです。

お役に立てれば!

于 2012-06-29T20:30:36.987 に答える
3
  std::string m_getY(char* p_msg)
  {
    return std::string(p_msg);
  }

  std::string m_getY(T* p_msg)
  {
    return p_msg->blah();
  }

ここでの問題は、Tischarの場合、同じシグネチャを持つ 2 つの関数になってしまうことです。

于 2012-06-29T20:30:21.313 に答える
1
std::string m_getY(char* p_msg)
{
  return std::string(p_msg);
}

template<typename U> 
std::string m_getY(U* p_msg)
{
  return p_msg->blah();
}

互いに競合しません(前者はテンプレートではないため、後者の特殊化ではありません)

于 2012-06-29T21:00:15.563 に答える
1

m_getYメソッドをメンバー関数テンプレートにすることができます。そして、この関数テンプレートを特殊化するchar*か、単に引数を持つメソッドを定義しchar*ます。この場合、クラス全体を複製する必要はありません。

于 2012-06-29T20:33:12.963 に答える