Шаблон C ++;Тип возврата функции автоматического вывода, переданный в качестве аргумента шаблона; - PullRequest
2 голосов
/ 28 октября 2019

Мне нужно вычесть тип возвращаемого значения функции-получателя. Этот метод получения передается как указатель на функцию в списке шаблонов.

Таким образом, метод получения выглядит следующим образом:

using TGetter   = std::function<std::string(Me*)>;

std::string getter(Me* me)
{
    return std::string("string");
}

Класс шаблона

template<typename TGetter>
class Handler
{
public:
    Handler(TGetter getter)
        :m_getter(getter)
    {};

    using TValue =  std::string;  //decltype(TGetter()); <- something like that I want to get

private:
    TGetter                     m_getter;
    ...

    bool handler();

Реализация выглядит так:

Handler<TGetter> h(getter);

Я хочу объявить TValue в зависимости от типа возвращаемого значения получателя. Так что std::string как для геттера в примере. У меня будут разные типы геттеров и палочек, чтобы объявить соответствующий тип просто как TValue value; внутри класса.

using TValue = decltype(TGetter()); преобразуется в указатель на функцию.

Не могли бы вы помочь мне? чтобы все правильно, спасибо.

Ответы [ 4 ]

2 голосов
/ 29 октября 2019

Если вы используете только std::function, вы можете сделать:

template <typename TGetter> class Handler;

template <typename Ret, typename ... Ts>
class Handler<Ret(Ts...)>
{
public:
    using TGetter = std::function<Ret(Ts...)>;

    Handler(TGetter getter) : m_getter(getter) {}

    using TValue = Ret;

private:
    TGetter                     m_getter;
    // ...

    bool handler();
};

с использованием, например Handler<std::string(Me*)> h(&getter);

Если вы хотите любой вызываемый тип, то:

template <typename TGetter>
class Handler
{
public:
    Handler(TGetter getter) : m_getter(getter) {}

    using TValue = decltype(declval<TGetter>()(/*args*/));

private:
    TGetter                     m_getter;
    // ...

    bool handler();
};
2 голосов
/ 28 октября 2019

Вы можете использовать std::invoke_result (начиная с C ++ 17).

using TValue = std::invoke_result_t<TGetter, Me*>;

До C ++ 17 вы используете std::result_of, примечаниеон устарел в C ++ 17 и его использование отличается от std::invoke_result.

using TValue = std::result_of_t<TGetter(Me*)>;
2 голосов
/ 28 октября 2019

Просто используйте std::declval, если ваша функция не имеет аргументов:

using TValue = decltype(std::declval<TGetter>()(/* your args go here */));
1 голос
/ 28 октября 2019

То, что вы ищете, это result_type, вероятно:

//...
public:
  using TValue =  typename TGetter::result_type;
//...

Демо .

...