c++ - 是否可以使函数模板从函数引用中获取 `decltype`?

标签 c++ c++11

我一直很难理解 std::function模板。似乎使用了我还不知道的魔法。它的模板参数是 class R , class... ARGS .但它可以作为 std::function<void> 传递给模板或 std::function<void()> .带参数的示例:std::function<void, int, float>std::function<void(int, float)> .这第二种语法是在 c++11 中引入的吗?我认为这在之前是无效的。

此外,有没有办法获得 decltype函数并将其传递给函数模板?这将使功能模板的设置变得更加容易。

这是一个例子:

#include <functional>
using namespace std;

///////////////////////////////////////////////////////////////////////////////
// this works
void x() {}
void y(int p0) {}

int main1()
{
  using namespace std::placeholders;
  function<decltype(y)> functors[] = { bind(x), bind(y, _1) };
  functors[0](1);
  functors[1](1);
  return 0;
}

///////////////////////////////////////////////////////////////////////////////
// this doesn't work
struct X
{
    void x() {}
    void y(int p0) {}
    void z(int i, int p0)
    {
      using namespace std::placeholders;
      static function<decltype(&X::y)> functors[] = { bind(&X::x, _1), bind(&X::y, _1, _2) };
      functors[i](this, p0);
    }
};

int main2()
{
  X xobj;
  xobj.z(0, 1);
  xobj.z(1, 1);
  return 0;
}

int main()
{
    return main1() + main2();
}

最佳答案

std::function接受一个模板参数,它必须是一个函数类型。您不能使用 std::function<void, int, float> . std::function<void(int, float)>是唯一有效的语法。

std::function在 C++11 中引入。没有 std::function在此之前。有 std::tr1::function但是,在 TR1 中定义,它使用相同的 std::function<void(int, float)>语法。

关于c++ - 是否可以使函数模板从函数引用中获取 `decltype`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19281694/

相关文章:

c++强制数组声明而不给参数

c++ - 让一个引用成员引用另一个成员是否合法?

c++ - 编写更通用的指针代码

c++ - 我必须在自己的析构函数中手动重置 shared_ptr 吗?

c++ - QNX 上的 std::call_once 延迟初始化问题

c++ - 数组初始化

c++ - 为什么在声明对象 std::vector 但从未使用时编译器不发出警告?

C++ char*[] 到 char** 的转换

c++ - 如何创建过滤流的成员 vector ?

c++ - std::notify_all_at_thread_exit 是如何工作的?