gpt4 book ai didi

C++ 用另一个函数包装一个通用的 std::tr1::function

转载 作者:太空狗 更新时间:2023-10-29 21:06:40 24 4
gpt4 key购买 nike

我如何用另一个函数包装一个通用 C++ std::tr1::function 对象,这样这个函数先执行,然后再执行包装函数?我试过:

#include <tr1/functional>

template <typename T>
int wrapped(const std::tr1::function<int(T)>& f, T t)
{
return f(t);
}

template <typename T>
std::tr1::function<int(T)> wrap(const std::tr1::function<int(T)>& f)
{
return std::tr1::bind(&wrapped, f, std::tr1::placeholders::_1);
}

int foo(int i) { return i; }

int main(int argc, char** argv)
{
std::tr1::function<int(int)> f =
wrap(std::tr1::bind(&foo, std::tr1::placeholders::_1));
f(1);
return 0;
}

但这会返回编译器错误 (g++):

wrap.cpp: In function ‘int main(int, char**)’:
wrap.cpp:22: error: no matching function for call to ‘wrap(std::tr1::_Bind<int (* ()(std::tr1::_Placeholder<1>))(int)>)’

最佳答案

我在您的代码中发现了两个问题。首先,wrapped 不是一个函数,它是一个函数模板,因此它不存在于生成的程序中。您不能获取函数模板的地址。您应该改为指定此模板的实例以获取以下地址:

template <typename T>
std::tr1::function<int(T)> wrap(const std::tr1::function<int(T)>& f)
{
return std::tr1::bind(&wrapped<T>, f, std::tr1::placeholders::_1);
}

其次(这就是您的编译器试图告诉您的)您必须在调用 wrap 时显式指定模板参数。编译器无法从提供的参数中推断出参数。

std::tr1::function<int(int)> f =
wrap<int>(std::tr1::bind(&foo, std::tr1::placeholders::_1));

我真的不明白 std::bindtr1::bind 在内部是如何工作的。但我知道返回的类型与简单的函数指针有很大不同,因此不允许编译器清楚地读取模板参数推导的类型。因此,在这些情况下,您需要明确指定类型。

关于C++ 用另一个函数包装一个通用的 std::tr1::function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7212937/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com