Базовый тип std :: необязательный в шаблоне - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть общий c код, который выполняет пройденную лямбду и проверяет выходные данные. Я хотел бы, чтобы вспомогательный метод был полностью выведен, но не может найти решение, так как метод возвращает std::optional, и я хочу, чтобы метод обработки возвращал его базовый тип. Код:

#include <optional>
#include <type_traits>

std::optional<int> dummy() { return {42}; };

template<typename F, typename Ret = std::result_of_t<F(void)>>
static Ret process(const F& f)
{
  Ret val{};
  if(auto res = f(); res) { val = *res;}
  return val;
}
int main()
{
  // call
  auto result = process(&dummy);
}

result, конечно, типа std::optional<int>. Что я должен изменить в своем определении шаблона, чтобы вывести тип возвращаемого процесса в базовый тип std::optional - int?

1 Ответ

1 голос
/ 13 апреля 2020

Все стандартные контейнеры хранят информацию о базовом типе данных в value_type typedef.

Почему бы не написать:

template<typename F, typename Ret = typename std::result_of_t<F(void)>::value_type >

, тогда для optional<int>, Ret равно int .

Демо

...