Могу ли я вывести тип возврата функции, переданной в качестве шаблона? - PullRequest
3 голосов
/ 25 октября 2019

У меня есть шаблонный метод, который принимает функцию, которой разрешено иметь любой возвращаемый тип, при условии, что он std::shared_ptr для класса, наследуемого от TService:

template<typename TService> struct BindSyntax {

  typedef std::shared_ptr<TService>(*CreateServiceFunction)(int);
  CreateServiceFunction myFunction;

  template<
    typename TResult,
    std::shared_ptr<TResult>(*TMethod)(const ServiceProvider &)
  >
  void ToFactoryMethod() {
    static_assert(
      std::is_base_of<TService, TResult>::value, "Result must inherit service"
    );

    myFunction = [](int mooh) {
      return std::static_pointer_cast<TService>(TMethod(mooh));
    };
  }
};

При вызове *Метод 1006 *, мне всегда нужно указывать тип возвращаемого значения функции, которую я ему предоставляю:

BindSyntax<Base> bind;
bind.ToFactoryMethod<Derived, exampleFactory>();

-

Можно ли заставить метод ToFactoryMethod<>() каким-либо образом вывеститип возвращаемого значения переданной функции?

Я хотел бы написать просто

BindSyntax<Base> bind;
bind.ToFactoryMethod<exampleFactory>();

Фрагмент исполняемого кода здесь: https://ideone.com/FYtN6Q

Ответы [ 2 ]

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

Полагаю, вы можете немного переписать ToFactoryMethod, чтобы он выглядел так

template<typename TResult>
void ToFactoryMethod(std::shared_ptr<TResult> (*TMethod)(const ServiceProvider&)) {
    static_assert(
            std::is_base_of<TService, TResult>::value, "Result must inherit service"
    );

    myFunction = [](int mooh) {
        return std::static_pointer_cast<TService>(TMethod(mooh));
    };
}

И затем назвать его так

bind.ToFactoryMethod(exampleFactory);
0 голосов
/ 25 октября 2019

Разве вы не можете использовать decltype или std::result_of' для получения возвращаемого типа TMethod и использовать его в is_base_of?

...