gpt4 book ai didi

c++ - 如何使用带有模板参数的 std::function

转载 作者:行者123 更新时间:2023-11-30 00:44:17 27 4
gpt4 key购买 nike

为什么这不起作用(在 C++11 中),我该如何解决:

#include <iostream>
#include <functional>

using namespace std;

template <typename T>
int apply(string x, const function<int(T)>& fn)
{
T t = { x };
return fn(t);
}

struct S {
string data;
};

int process_s(const S& s)
{
return s.data.size();
}

int main()
{
cout << apply("abc", process_s);
}

错误是

prog.cc:21:8: error: no matching function for call to 'apply'
cout<<apply("abc", process_s);
^~~~~
prog.cc:7:5: note: candidate template ignored:
could not match 'function<int (type-parameter-0-0)>'
against 'int (const S &)'
int apply(string x, const function<int(T)>& fn) {
^
1 error generated.

我尝试了 here 中的方法, 但它也不起作用:

#include <iostream>
#include <functional>

using namespace std;

template <typename T>
struct id {
typedef T type;
};

template <typename T>
using nondeduced = typename id<T>::type;

template <typename T>
int apply(string x, const function<nondeduced<int(T)> >& fn)
{
T t = { x };
return fn(t);
}

struct S {
string data;
};

int process_s(const S& s)
{
return s.data.size();
}

int main()
{
cout << apply("abc", process_s);
}

最佳答案

第二种方法只有在有另一种方法可以推断出 T 时才有效。 .您的用例没有其他可用于该推导的函数参数。

您最初的尝试推导失败,因为函数指针/引用 ( process_s ) 不是 std::function .隐式转换不算数,它必须是一个类型为 std::function 的对象推导成功的实例化。

假设没有向函数添加更多参数的选项,您有两个选择:

  1. 明确指定模板参数,如apply<S>(...) .
  2. 创建 std::function对象并将其作为第二个函数参数传递给您的第一次尝试。

第二个选择在 C++17 中可以不那么难看,因为现在有 deduction guides可用的。所以调用实际上可以变成 apply("abc", std::function{process_s});

关于c++ - 如何使用带有模板参数的 std::function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49473381/

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