在c ++代码中奇怪地使用void

时间:2014-05-14 12:17:11

标签: c++ std

以下是关于C ++中异步任务的演示文稿中的一些代码

template <class T> class Future<T>{
  //something
  void  foo(std::function<void(T)> cb);    
  //something
};

void(T)是什么意思?

4 个答案:

答案 0 :(得分:7)

  

void(T)是什么意思?

指定函数类型;具体来说,一个函数采用T类型的单个参数,并且不返回任何内容。通常,复杂类型的类型说明符看起来像它们对应的变量声明,但没有变量名称:

void f(T); // declare a function
void(T)    // specifier for a function type

int a[42]; // declare an array
int[42]    // specifier for an array type

在这种情况下,函数类型用于指定std::function的函数调用运算符的签名:

void operator()(T);

这样函数对象就可以像使用该类型的函数一样使用:

T some_t;
cb(some_t); // usable like a function taking `T`

答案 1 :(得分:6)

cbstd::function,其operator()需要T并返回void

答案 2 :(得分:1)

void(T)是函数签名(类型)

注意签名不是指向函数的指针,不是指向成员函数的指针而不是lambda:

#include<functional>

void a(int) {}
struct B {
    void f(int) {}
};


int main() {
    std::function<void(int)> fn;
    fn = a;

    B b;
    fn = std::bind(&B::f, b, std::placeholders::_1);

    auto lambda = [](int) {};
    fn = lambda;
}

答案 3 :(得分:0)

基于C ++ 11规范,解释如下:A parameter list consisting of a single unnamed parameter of non-dependent type void is equivalent to an empty parameter list.

void不是函数的有效参数类型,但是void(T)中的T是依赖类型,它取决于模板参数。这样,您可以根据模板的参数在函数中没有参数。