Я удалил все, что не имело отношения к вашему вопросу (вы должны сделать это, чтобы облегчить получение помощи), и вот что мне нужно для работы. Сначала я переместил миллисекунды перед вариативными аргументами. Это может сбить компилятор с толку, где заканчиваются пакеты параметров, поэтому обычно вы хотите, чтобы ... было последним в списке аргументов.
Во-вторых, CTAD (вывод аргументов шаблона класса) не работает для вас из-за необходимости преобразовать вашу лямбду в std :: function, прежде чем она сможет соответствовать.
Если main () передает фактическую std :: function в ваш конструктор, как он ожидает, он работает:
auto timer = Timer(
std::function<void(int, int, float)>([](int a, int b, float c) { }),
500ms, 15, 17, 12.0f);
Но это, возможно, выглядит хуже, чем то, что вы изначально пробовали.
Лучшее исправление, которое немного неясно, - помочь CTAD понять, что вы делаете, с помощью руководства по дедукции C ++ 17. Это сопоставление с шаблоном, говорящее, что если они попытаются создать этот класс с использованием синтаксиса this, это на самом деле означает, что это этот тип.
Вот руководство, которое я нашел для вас:
template <typename T, typename... Args>
Timer(T&&, std::chrono::milliseconds, Args...) -> Timer<Args...>;
В этом руководстве говорится: они могут передавать все, что угодно, T && в качестве первого параметра, и он просто игнорируется, за ним следуют хроно миллисекунды, а затем еще несколько типов в пакете Args. Учитывая это, фактический тип таймера (справа от стрелки) - это просто таймер ‹аргументы ...› какими бы они ни были. Затем он продолжается, и ваша функция просто должна быть преобразована в std :: function.
Теперь он соответствует вашему использованию с лямбда, создает экземпляр Timer с заданными аргументами и, исходя из этого, знает, что он может преобразовать вашу лямбду в функцию std ::.
Вот рабочий пример без всего, что не было связано:
#include <functional>
#include <chrono>
using namespace std::chrono_literals;
template<typename ...Args>
struct Timer {
Timer(std::function<void(Args...)> func, std::chrono::milliseconds step, Args&&... args )
{ }
};
template <typename T, typename... Args>
Timer(T&&, std::chrono::milliseconds, Args...) -> Timer<Args...>;
int main() {
auto timer = Timer([](int a, int b, float c) { }, 500ms, 15, 17, 12.0f);
}
Обозреватель компилятора: https://godbolt.org/z/Wa3oK3
person
Chris Uzdavinis
schedule
29.10.2020