函数重载和模板函数有什么区别?哪个更合适?
What is the difference between function overloading and template function? Which is more appropriate?
template<>std::string Add(std::string x ,std::string y)
{
return x.append(y);
}
std::string Add(std::string x ,std::string y)
{
return x.append(y);
}
如果我们可以使用函数重载来专门化代码,为什么需要模板专用化?
如果我们可以使用函数重载来专门化代码。为什么需要模板专业化
因为是不同的东西,不同的行为。
一个实际的例子。
以下示例编译和链接没有问题
#include <string>
void foo (std::string const &)
{ }
int main ()
{
foo("abc");
}
请注意,"abc"
可以转换为std::string
但不是std::string
(是char const [4]
(。
因此,调用常规(非模板(函数时,必要时会转换参数。
观察以下代码
#include <string>
template <typename T>
void foo (T const &);
template <>
void foo (std::string const &)
{ }
int main ()
{
foo("abc");
}
现在代码编译但不链接:foo()
是一个模板(仅声明(模板函数,仅定义了std::string
完全专用化。
这一次,编译器推导出参数的类型(char const [4]
,不同于std::string
(,所以给出了一个行错误,因为没有定义foo()
的通用版本。
通过这种方式,您可以强制规定只能使用std::string
调用foo()
,而不能使用可转换为std::string
的值调用。
你可以得到同样的东西,混合重载和模板,获得编译(不链接(错误如下
#include <string>
template <typename T>
void foo (T const &) = delete;
void foo (std::string const &)
{ }
int main ()
{
foo("abc");
}
现在非模板foo()
可以(理论上(接受char cont [4]
,但被声明(并删除(模板版本。因此,再次考虑到char const [4]
不是std::string
,编译器优先于模板版本。该内容已删除。所以编译错误。
因为根据用例,您有时会编写通用的容器/函数,即它们适用于每种类型。比如std::vector
.但是,当您执行std::vector<string>
和std::vector<const char*>
(虽然两者都表示字符串(时,向量的含义并不相同,因为一个存储字符串,另一个存储指向以 null 结尾的字符串的指针。那么,从设计的角度来看,您将如何解决这个问题呢?
好吧,你要么忽略此类型的问题,要么阻止使用此类型,要么编写一个专用化,使此容器以不同的方式为此类类型工作,以实现您的设计目的。同样,你为函数编写一个专用化,这取决于你试图解决的问题。
因此,这些模板专业化是为了解决特定类型的问题。如果您不需要它,请不要使用它。您不需要无缘无故地使您的代码复杂化。
这取决于用例。 考虑一个函数 Add((,它排除两个变量并返回总和。现在,根据用例,这两个变量可以是整数或浮点数。这可以通过以下两种方式实现:
Template <typename T>
T Add(T x, T y)
{
return x + y;
}
或者,您可以分别编写两个函数。一个用于整数,一个用于浮点参数。
int Add(int x, int y)
{
return x + y;
}
和
float Add(float x, float y)
{
return x + y;
}
- 什么时候调用组成单元对象的析构函数
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 什么时候调用析构函数
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 是什么让放置新调用对象的构造函数?
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 函数名称表示什么等等
- 在函数中拥有函数原型的目的是什么?
- 使用基类指针调用基类的值构造函数的语法是什么?
- 什么是自定义比较器以及如何在 C++ 的排序函数中使用它?
- C++:使用方法调用析构函数的顺序是什么?
- 将此布尔值传递给此函数的最有效方法是什么?
- lambda函数什么时候对C++中的类有用
- 函数什么时候必须在c++中返回引用
- 如果void类型函数什么都不返回会发生什么