gpt4 book ai didi

c++ - 调用函数时未找到 std::function 构造函数

转载 作者:行者123 更新时间:2023-11-30 02:04:48 24 4
gpt4 key购买 nike

我有一个声明如下的函数;它的确切工作与此无关。

template<typename T>
std::pair<int, int>
partition3(T *pT, const int N, const T &Kq, const int w,
std::function<int(const T&, const T&, int)> P);

在调用站点我尝试执行以下操作:

bool partition3_test()
{
struct cmp
{
int operator()(int x, int y, int) const
{ return x-y; }
};

int V1[11] = { 3, 7, 1, 7, 7, 8, 10, 2, 16, 4, 3 },
V2[11] = { 3, 6, 1, 6, 6, 8, 10, 2, 16, 4, 3 };

std::function<int(const int&, const int&, int)> F = cmp();

std::pair<int, int>
p1 = partition3(V1, 11, 7, 0, cmp()),
p2 = partition3(V2, 11, 7, 0, cmp());

return false;
}

对于 partition3 的两次调用,编译器 (MSVC 2010) 提示它无法为最后一个参数推导出模板参数。如果我将 cmp() 替换为 F,代码将编译并正常运行。

我有两个问题:

  1. 为什么会出现错误? [编译器错误或一些神秘的 C++ 规则?]
  2. 如果不首先显式构造 F,我如何才能达到相同的效果?

(目前,我已经通过在 partition3 上引入另一个模板参数并将 P 声明为该模板类型来解决这个问题。)

最佳答案

cmp()实际上不是 std::function根本。复制初始化工作的事实可能会混淆这个问题,但是它使用了一个转换构造函数,它必须使用某种包装对象,我很惊讶它对一个临时仿函数对象起作用(啊,检查它的标准显然复制了仿函数)。

最重要的是,函数参数不匹配(按值传递和按常量引用传递与源代码兼容,但与运行时调用不兼容),这又需要一个适配器。

最好的解决方案是使模板函数更通用,这样它也可以与原始函数指针和任意仿函数对象一起使用,而不仅仅是 std::function :

template<typename T, typename Functor>
std::pair<int, int> partition3(T *pT, const int N, const T &Kq, const int w,
const Functor& P);

如果出于某种原因你真的想使用 std::function (例如,您需要虚拟调度),您可以。与 Nawaz 所写完全相反的错误是,这一个可推导的上下文,但不止一种类型适合(这是 std::function 的适配器/包装器性质变得重要的地方,因为类型不必与参数完全匹配,它只需要兼容即可。std::function<int(const long&, const long&, int)> 也会匹配。)

改用不可推导的上下文,这样编译器甚至不会尝试使用仿函数来推导T。 .

template<typename T, typename Functor>
std::pair<int, int> partition3(T *pT, const int N, const T &Kq, const int w,
std::function<std::identity<const T>::type&, std::identity<const T>::type&, int> P);

关于c++ - 调用函数时未找到 std::function 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10162431/

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