C++ 自动推断模板中函数的类型

C++ 自动推断模板中函数的类型,c++,templates,c++14,generic-programming,C++,Templates,C++14,Generic Programming,我有简单的map实现和简单的id(标识): 当我这样做时,我会得到错误: error: cannot resolve overloaded function 'id' based on conversion to type 'std::function<const int&(const int&)>' map(a, id); ^ 错误:无法基于到类型“std::function”的转换解析重载函数“id” 地图(a,id); ^ 当错误包含右

我有简单的
map
实现和简单的
id
(标识):

当我这样做时,我会得到错误:

error: cannot resolve overloaded function 'id' based on conversion to type 'std::function<const int&(const int&)>'
 map(a, id);
          ^
错误:无法基于到类型“std::function”的转换解析重载函数“id”
地图(a,id);
^

当错误包含右边界类型时,我如何解决它?为什么编译器不能从
map
中的上下文推断
id
的类型?

这是因为
id
不是一个函数。这是一个函数模板

这意味着
id
是一个生成函数(如
id
)的模板,但它本身并不是真正的函数


在运行时没有
id
,只有
id

创建的函数实例。如果您处于符合C++14的环境中,有一种非常干净的方法可以做到这一点。使用无约束转发引用和通用lambda,而不是使用std::function和模板类,如下所示:

#include <vector>

template <typename T,typename F>
T map(const T& x, F &&f) {
  T res(x.size());
  auto res_iter = begin(res);
  for (auto i(begin(x)); i < end(x); ++i) {
    *res_iter++ = f(*i);
  }
  return res;
}

auto id = [](auto x) { return x;};

int main()
{
  std::vector<int> v = {1, 2, 3, 4};
  auto v2 = map(v, id);
}
struct {
  template<typename T>
  T operator()(T x) const
  {
    return x;
  }
} id;
#包括
模板
T图(常数T&x、F&F){
T分辨率(x.size());
自动恢复=开始(恢复);
对于(自动i(开始(x));i
在C++11中,必须使用其运算符()为模板化方法的函子替换泛型lambda,如下所示:

#include <vector>

template <typename T,typename F>
T map(const T& x, F &&f) {
  T res(x.size());
  auto res_iter = begin(res);
  for (auto i(begin(x)); i < end(x); ++i) {
    *res_iter++ = f(*i);
  }
  return res;
}

auto id = [](auto x) { return x;};

int main()
{
  std::vector<int> v = {1, 2, 3, 4};
  auto v2 = map(v, id);
}
struct {
  template<typename T>
  T operator()(T x) const
  {
    return x;
  }
} id;
struct{
模板
T运算符()(T x)常数
{
返回x;
}
}身份证;

<>在C++ 98语法中,你将不能使用转发引用,所以你必须考虑拷贝和函子的可变性问题。

但是当编译器看到代码< > ID <代码> >以<代码> int >代码>作为参数时,它不应该创建<代码> ID < /代码>的实例吗?解决方法是什么?那么解决方案是使用<代码> ID <代码>问题是“我怎样才能……”,答案是“这是因为……”-1@Slava:fair enough我将把我先前的非答案中有用的部分转化为注释:通常最好为函数输入(以及类型签名的文档)使用一个普通模板参数,而不是
std::function
。它并没有解决这个问题,但类似于:
模板t映射(const t&x,F&&F)
。如果C++类型的推理稍微有点远,那么STD::函数会很棒。在这个版本中,模板可以使用<代码> map < /C>吗?我不知道你所说的“模板可以使用吗?”你能详细说明吗?
struct {
  template<typename T>
  T operator()(T x) const
  {
    return x;
  }
} id;