std::function vs вызываемый как параметр шаблона

Почему в приведенном ниже примере строка 20 вызывает ошибку, описанную в строках с 27 по 30?

Вызов exec1в строке 33 работает нормально.

      #include <cstdint>
#include <functional>
#include <iostream>
#include <tuple>
#include <type_traits>

template <typename... t_fields>
void exec0(std::function<std::tuple<t_fields...>()> generate,
           std::function<void(t_fields &&...)> handle) {
  std::tuple<t_fields...> _tuple{generate()};
  std::apply(handle, std::move(_tuple));
}

template <typename t_generate, typename t_function>
void exec1(t_generate generate, t_function handle) {
  auto _tuple{generate()};
  std::apply(handle, std::move(_tuple));
}

int main() {
  auto _h = [](uint32_t u) -> void { std::cout << "u = " << u << '\n'; };

  auto _g = []() -> std::tuple<uint32_t> { return std::tuple<uint32_t>{456}; };

  //  exec0<uint32_t>(_g, _h);
  /*
main.cpp:25:3: error: no matching function for call to 'exec0'
main.cpp:8:6: note: candidate template ignored: could not match
'function<tuple<unsigned int, type-parameter-0-0...> ()>' against '(lambda at
/var/tmp/untitled002/main.cpp:23:13)'
  */

  exec1(_g, _h);

  return 0;
}

g++ --versionответы:

      g++ (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

1 ответ

Хотя вы указали <uint32_t>в качестве аргумента шаблона компилятор, кажется, пытается вывести больше элементов для пакета параметров, но не может этого сделать (поскольку тип лямбды не std::function<...>), и расстраивается.

Вам нужно каким-то образом запретить вывод аргумента шаблона.

Либо назовите это как exec0<uint32_t>({_g}, {_h});или оберните типы параметров в std::type_identity_t<...>(или, до C++20, std::enable_if_t<true, ...>).

Тогда компилятор примет ваш uint32_tкак единственный тип в пакете, и не будет пытаться добавить больше типов.

Другие вопросы по тегам