无法推断出' std :: function'的模板参数。

时间:2014-05-23 12:12:42

标签: c++ templates c++11 std-function

我通常从不写C ++,今天我尝试过使用C ++模板。我实现了一个看起来像这样的Maybe类型

#include <functional>
#include <iostream>
#include <string>
template<typename T>
class TMaybe
{
  T value;
public:
  TMaybe() : value(nullptr){}
  TMaybe(T &&v) : value(v){}
  TMaybe(T v) : value(v){}
};

template<typename T, typename R>
TMaybe<R> maybe_if(const TMaybe<T> &m, std::function<R(T v)> f){
  return (m.value != nullptr) ? TMaybe<R>(f(m)) : TMaybe();
}

int main(){
  int i = 10;
  auto m = TMaybe<int>(i);
  auto plus_ten = [](int i) -> int {return i + 10;};
  maybe_if(m, plus_ten); // could not deduce template argument for 'std::function<R(T)>' from 'main::<lambda_17413d9c06b6239cbc7c7dd22adf29dd>'
}

但错误消息could not deduce template argument for 'std::function<R(T)>' from 'main::<lambda_17413d9c06b6239cbc7c7dd22adf29dd>'不是很有帮助。你能发现错误吗?

1 个答案:

答案 0 :(得分:3)

如果您将R的实际实例传递给f,编译器只能从std::function<R(T)>推导出std::function;传递lambda将不起作用,因为lambda不是R特化的实例。

编写代码的正确方法是允许任何仿函数类型,并从中推导出template<typename T, typename F, typename R = typename std::result_of<F(T)>::type> TMaybe<R> maybe_if(const TMaybe<T> &m, F f){ return (m.value != nullptr) ? TMaybe<R>(f(m.value)) : TMaybe(); }

{{1}}