我正在尝试以 monad 风格编写语法糖,超过 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
, ( demo ).
2) 因为模板参数推导不考虑转换。
3) 重载对于一元函数是一种可接受的解决方案,但是当你有像 operator+(optional, optional)
这样的二元函数时,它就开始令人烦恼了。 ,并且对于三元、四元、等函数来说很痛苦。
最佳答案
另一个版本。这个不涉及任何内容:
template <typename T>
void f(T&& t) {
std::optional opt = std::forward<T>(t);
}
类模板参数推导在这里已经做了正确的事情。如果 t
是 optional
,则复制扣除候选者将是首选,我们将返回相同的类型。否则,我们将其包装起来。
关于c++ - 使接受可选的函数接受非可选的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51945067/