c++ - 作为模板参数传递的函数

标签 c++ templates code-generation functor

我正在寻找涉及将 C++ 模板函数作为参数传递的规则。

这是由 C++ 支持的,如此处的示例所示:

#include <iostream>

void add1(int &v)
{
  v+=1;
}

void add2(int &v)
{
  v+=2;
}

template <void (*T)(int &)>
void doOperation()
{
  int temp=0;
  T(temp);
  std::cout << "Result is " << temp << std::endl;
}

int main()
{
  doOperation<add1>();
  doOperation<add2>();
}

但是,学习这种技术很困难。 Googling for "function as a template argument"不会导致太多。还有经典C++ Templates The Complete Guide令人惊讶的是也没有讨论它(至少不是从我的搜索中)。

我的问题是这是否是有效的 C++(或只是一些广泛支持的扩展)。

另外,在这种模板调用期间,有没有办法允许具有相同签名的仿函数与显式函数互换使用?

以下内容在上述程序中不起作用,至少在 Visual C++ 中是这样。 ,因为语法显然是错误的。能够为仿函数切换函数会很好,反之亦然,类似于如果您想定义自定义比较操作,您可以将函数指针或仿函数传递给 std::sort 算法。

   struct add3 {
      void operator() (int &v) {v+=3;}
   };
...

    doOperation<add3>();

如果指向一个或两个 Web 链接,或者 C++ 模板书中的一个页面,我们将不胜感激!

最佳答案

是的,它是有效的。

至于让它与仿函数一起使用,通常的解决方案是这样的:

template <typename F>
void doOperation(F f)
{
  int temp=0;
  f(temp);
  std::cout << "Result is " << temp << std::endl;
}

现在可以称为:

doOperation(add2);
doOperation(add3());

See it live

问题在于,如果编译器难以内联对 add2 的调用,因为编译器只知道函数指针类型 void (*)( int &) 被传递给 doOperation。 (但是 add3 作为一个仿函数,可以很容易地内联。这里,编译器知道一个 add3 类型的对象被传递给函数,这意味着函数call 是 add3::operator(),而不仅仅是一些未知的函数指针。)

关于c++ - 作为模板参数传递的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1174169/

相关文章:

c++ - 为什么下面的程序没有选择与第一个模板参数相同类型的参数?

c++ - 如何使用内部类类型初始化模板类中的静态字段

c++ - 删除特定索引处的 vector 元素

c++ - 如何隐藏 QFileSystemModel 中的特定目录

c++ - 使用可变参数模板在 C++ 中实现差异化

java - arg 参数中的代码模型/引号 (")

c# - 在 .NET Core 2.x csproj 项目中可靠地生成 C# 代码?

C++ 语法我不明白

c++ - 如何在 Armadillo 中序列化稀疏矩阵并与boost的mpi实现一起使用?

asp.net - 导出PhoneGap的ASP.NET MVC应用程序源代码