我正在尝试以单子风格的方式,对 std::optional
编写语法糖。请考虑以下内容:
template<class T>
void f(std::optional<T>)
{}
当前函数只接受可选的
T
1(例如int
),即使存在从T
到std::optional<T>
2的转换。请问是否有一种方法可以使f
接受std::optional<T>
或者在调用时将T
转换为可选类型,而不需要定义一个重载函数3?1)
f(0)
会报错:error: no matching function for call to 'f(int)'
和note: template argument deduction/substitution failed
,(演示)。2) 因为模板参数推导不考虑转换。
3) 对于一元函数,重载是可接受的解决方案,但对于二元函数,如
operator+(optional, optional)
,则开始变得烦人,并且对于三元、四元等函数则更加困难。
F=λxy.
,有一个optional(x)
和一个optional(y)
,返回一个optional(F(xy))
。为了让这样的定义有用并允许其用户链接表达式,它需要接受可选项和标量。 - YSCstd::optional<std::optional<T>>
?而如果你有一个单子提升运算符,你只需要lift(F)
,就不会有这个问题了。 - Konrad Rudolph