std::function 可以有一个函数指针作为类型吗?
Can std::function have a function pointer as the type?
假设我有如下所示的 C 风格 callback
类型。对于 C++,我可以创建一个 std::function
类型,如 callback2
,这种声明是我能找到的所有示例。但是我可以像下面的 callback3
一样重复使用 callback
而不是再次输入签名吗?
如果可以callback3
,
如何调用回调?像下面这样的 c.target<callback>();
是调用回调的正确方法吗?
如何传递成员函数?对于普通类型,我可以使用 worker2([this]() {toBeCalled();});
但 worker3([this]() {toBeCalled();});
不起作用。
代码
typedef void (*callback)();
typedef std::function<void()> callback2;
typedef std::function<callback> callback3;
void worker(callback c)
{
c();
}
void worker2(callback2 c)
{
c();
}
void worker3(callback3 c)
{
//Is this the way to call the callback?
c.target<callback>();
}
class Caller
{
public: Caller()
{
//worker2([this]() {toBeCalled();});
worker3(????);
}
void toBeCalled()
{
std::cout << "toBeCalled()";
}
};
Can std::function have a function pointer as the type?
没有。 class 模板 std::function
仅为函数类型模板参数定义。对于所有其他参数类型,包括函数指针,模板未定义。
我还建议不要在一般情况下使用别名指针类型(尽管这个经验法则有例外)。如果你避免它,那么你可以重新使用别名就好了:
typedef void callback();
typedef std::function<callback> callback2;
// or preferably using the modern syntax
using callback = void();
using callback2 = std::function<callback>;
void worker (callback* c);
void worker2(callback2 c);
您可以在 callback
上使用 std::remove_pointer
。假设您的函数类型是 T
,而 callback
的类型是 T*
。 std::remove_pointer_t<T*>
会给出 T
。在你的情况下 T
是 void()
而 T*
是 void(*)()
.
typedef void(*callback)();
typedef std::function<void()> callback1;
typedef std::function<std::remove_pointer_t<callback>> callback2;
void worker(callback c){
c();
}
void worker1(callback1 c){
c();
}
void worker2(callback2 c){
c();
}
int main()
{
worker([]{std::cout << "callback\n";});
worker1([]{std::cout << "callback1\n";});
worker2([]{std::cout << "callback2\n";});
}
/*
Output
callback
callback1
callback2
*/
现在,callback1
和 callback2
是同一类型的别名,即本例中的 std::function<void()>
。
假设我有如下所示的 C 风格 callback
类型。对于 C++,我可以创建一个 std::function
类型,如 callback2
,这种声明是我能找到的所有示例。但是我可以像下面的 callback3
一样重复使用 callback
而不是再次输入签名吗?
如果可以callback3
,
如何调用回调?像下面这样的
c.target<callback>();
是调用回调的正确方法吗?如何传递成员函数?对于普通类型,我可以使用
worker2([this]() {toBeCalled();});
但worker3([this]() {toBeCalled();});
不起作用。
代码
typedef void (*callback)();
typedef std::function<void()> callback2;
typedef std::function<callback> callback3;
void worker(callback c)
{
c();
}
void worker2(callback2 c)
{
c();
}
void worker3(callback3 c)
{
//Is this the way to call the callback?
c.target<callback>();
}
class Caller
{
public: Caller()
{
//worker2([this]() {toBeCalled();});
worker3(????);
}
void toBeCalled()
{
std::cout << "toBeCalled()";
}
};
Can std::function have a function pointer as the type?
没有。 class 模板 std::function
仅为函数类型模板参数定义。对于所有其他参数类型,包括函数指针,模板未定义。
我还建议不要在一般情况下使用别名指针类型(尽管这个经验法则有例外)。如果你避免它,那么你可以重新使用别名就好了:
typedef void callback();
typedef std::function<callback> callback2;
// or preferably using the modern syntax
using callback = void();
using callback2 = std::function<callback>;
void worker (callback* c);
void worker2(callback2 c);
您可以在 callback
上使用 std::remove_pointer
。假设您的函数类型是 T
,而 callback
的类型是 T*
。 std::remove_pointer_t<T*>
会给出 T
。在你的情况下 T
是 void()
而 T*
是 void(*)()
.
typedef void(*callback)();
typedef std::function<void()> callback1;
typedef std::function<std::remove_pointer_t<callback>> callback2;
void worker(callback c){
c();
}
void worker1(callback1 c){
c();
}
void worker2(callback2 c){
c();
}
int main()
{
worker([]{std::cout << "callback\n";});
worker1([]{std::cout << "callback1\n";});
worker2([]{std::cout << "callback2\n";});
}
/*
Output
callback
callback1
callback2
*/
现在,callback1
和 callback2
是同一类型的别名,即本例中的 std::function<void()>
。