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;
}

谢谢大家的建议。已经提出了两种有效的解决方案。我可以专门化 doX 方法,或者专门化 m_ge​​tY() 方法。

归根结底,我更喜欢将我的专业化保密而不是公开,所以我接受了 Krill 的回答。

4

4 回答 4

7

您可以将整个模板类中的一个函数专门化为特定类型,而无需专门化整个类。它看起来像这样:

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();
  }

这里的问题是,当T是时char,您最终会得到两个具有相同签名的函数。

于 2012-06-29T20:30:21.313 回答
1

您可以使您的方法m_getY成为成员函数模板。他们使这个函数模板专门化char*或简单地定义一个带有char*参数的方法。在这种情况下,您不必复制整个班级。

于 2012-06-29T20:33:12.963 回答
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();
}

will not conflict with each other (and the former is not a specialisation of the latter, as it is not a template)

于 2012-06-29T21:00:15.563 回答