非类型函数模板参数

发布于 2024-11-26 14:25:12 字数 796 浏览 2 评论 0 原文

我正在阅读 C++ 模板完整指南,遇到了这个非类型函数模板参数代码(我添加了 main() 和除函数定义和调用之外的其他部分):

#include <vector>
#include <algorithm>
#include <iostream>

template <typename T, int value>
T add (T const & element){
  return element + value;
}

int main() {
  int a[] = {1,2,3,4};
  int length = sizeof (a) / sizeof (*a);
  int b[length];
  std::transform (a, a + length, b, (int(*)(int const &))add <int, 5>); //why?
  std::for_each (b, b + length, [](int const & value){ std::cout << value << '\n'; });
  return 0; 
}

读完书后我不明白为什么我们需要类型转换函数调用的?

编辑: 书中的解释:

add 是一个函数模板,函数模板被认为是命名一组重载函数(即使该集合只有一个成员)。然而,根据当前标准,重载函数集不能用于模板参数推导。因此,您必须转换为函数模板参数的确切类型:...

编译器:Ubuntu 10.10 上的 g++ 4.5.1

I am reading C++ Templates Complete Guide and came across this non-type function template parameters code (I have added the main() and other parts except the function definition and call):

#include <vector>
#include <algorithm>
#include <iostream>

template <typename T, int value>
T add (T const & element){
  return element + value;
}

int main() {
  int a[] = {1,2,3,4};
  int length = sizeof (a) / sizeof (*a);
  int b[length];
  std::transform (a, a + length, b, (int(*)(int const &))add <int, 5>); //why?
  std::for_each (b, b + length, [](int const & value){ std::cout << value << '\n'; });
  return 0; 
}

I did not understand after reading from the book why we need typecasting of the function call?

EDIT:
Explaination from the book:

add is a function template, and function templates are considered to name a set of overloaded functions (even if the set has only one member). However, according to the current standard, sets of overloaded functions cannot be used for template parameter deduction. Thus, you have to cast to the exact type of the function template argument:...

Compiler: g++ 4.5.1 on Ubuntu 10.10

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

不再让梦枯萎 2024-12-03 14:25:12

严格来说,您不能通过简单地给出模板参数列表来引用函数模板的特化。您始终必须有一个目标类型(例如,您传递给的函数参数类型,或者您转换为的转换类型,或者您分配给的变量类型)。

即使目标类型完全没有模板参数,情况也是如此,例如

template<typename T> void f() { }
template<typename T> void g(T) { }

int main() {
  g(f<int>); // not strictly valid in C++03
  g((void(*)())f<int>); // valid in C++03
}

委员会 添加了 C++0x 和流行编译器在 C++03 模式下采用的规则,如果您提供完整的模板参数列表,则可以省略目标类型为所有模板参数以及所有默认模板参数提供类型。

Strictly speaking, you couldn't refer to the specialization of a function template by simply giving a template argument list. You always had to have a target type around (like, a function parameter type you pass to, or a cast type you cast to, or a variable type you assign to).

That was the case even if the target type is completely free of template parameters, for example

template<typename T> void f() { }
template<typename T> void g(T) { }

int main() {
  g(f<int>); // not strictly valid in C++03
  g((void(*)())f<int>); // valid in C++03
}

The committee added rules that were adopted into C++0x and by popular compilers in their C++03 mode that made it possible to omit a target type if you supply a complete template argument list supplying types for all template parameters, together with all default template arguments.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文