gpt4 book ai didi

c++ - 从 std::function 的返回类型推导出模板参数

转载 作者:行者123 更新时间:2023-11-27 23:05:32 24 4
gpt4 key购买 nike

我通常从不编写 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>'不是很有帮助。你能发现错误吗?

最佳答案

编译器只能推断R来自 f如果你传递给它一个 std::function<R(T)> 的实际实例;传递 lambda 是行不通的,因为 lambda 不是 std::function 的实例特化。

编写代码的正确方法是允许任何仿函数类型,并推导 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();
}

关于c++ - 从 std::function 的返回类型推导出模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23828930/

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