Я пытаюсь написать синтаксический сахар в монад-стиле, поверх 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)
, и это боль для тройных, 4-арных и т.д. Функций.