函数重载与函数模板 - C++

kus*_*lvm 22 c++ templates overloading

在关于C++的书籍中,当我们在C++中使用模板时,为什么我们会教我们使用函数重载?

展示模板的有效(和正确)使用不是更好吗?与大多数C++书籍中教授函数重载的地方相反?

或者,是否有充分的理由使用一个而不是另一个?

jua*_*nza 25

当您希望对可能不同的类型执行相同的操作时,模板提供了一个优势.一个简单的例子:

template <typename T>
T foo(const T& a, const T& b) { return a + b; }
Run Code Online (Sandbox Code Playgroud)

如果要根据类型应用不同的操作,可以使用重载:

struct Foo{ void foo() const {} };

void foo(int i) { std::cout << "i = " << i << "\n"; }
void foo(const Foo& f) { f.foo(); }
Run Code Online (Sandbox Code Playgroud)

您可以使用模板和模板特化来实现上述目标,但是这些特化应该代表一般情况的一些例外.


Mik*_*ran 6

当您想对许多不同的数据类型执行相同的一组操作时,通常会使用模板。

当您想对某些数据集执行不同的操作时,通常会使用函数重载。

在您希望对许多不同的数据类型执行相同操作集的情况下,模板的优势在于编译器将在编译时为您处理您将来可能创建的使用模板化函数的任何可能的新类型。如果要使用函数重载,则每次创建要传递给特定函数的新类型时都必须创建新的函数重载。


Pup*_*ppy 6

模板不能使用不同数量的参数.超载可以.此外,模板表明您可以对任何数据类型进行操作,但实际上,绝大多数模板都只是特殊化(在您的系统中),因此表示这一点毫无意义.此外,重载可以是virtual,模板专业化不能.专业化也不能与基地的签名不同.

template<typename T> void foo(T& t);
template<> void foo<std::string>(std::string* ptr); // Illegal
void foo(std::string* ptr); // Legal
Run Code Online (Sandbox Code Playgroud)

与当前系统相比,这将严重限制您可以产生的过载类型.

  • 在C + 11模板中,技术上可以采用多个参数,http://en.wikipedia.org/wiki/Variadic_template,但与函数重载相比,它们并不容易使用. (2认同)