Частичная спецификация шаблона ⇐ C++
-
Anonymous
Частичная спецификация шаблона
У меня есть следующий класс шаблона, похожий на оболочку функции:
с использованием MethodId = std::uint16_t; шаблон класс BaseMethod { публика: BaseMethod(const Func &func, std::uint16_t Method_id): _function(func), _method_id(method_id) {} шаблон autooperator()(Args... args) -> decltype(_function(std::forward(args)...)) { return _function(std::forward(args)...); } шаблон автоматический вызов (Args... args) -> decltype(_function(std::forward(args)...)) { return _function(std::forward(args)...); } частный: Функ _функция; Идентификатор метода _идентификатор_метода; }; с этим шаблоном класса я могу использовать вот так:
int adder(int x, int y){return x+y;} BaseMethod foo_tempalte(adder, 0); но я также хочу поддержать такое использование:
BaseMethod bar_tempalte(adder, 0); Поэтому я добавляю частичную версию спецификации:
template класс BaseMethod { публика: BaseMethod(Ret (*func)(Args...), std::uint16_t метод_id): _function(func), _method_id(method_id) { } Оператор Ret()(Args... args) { return _function(std::forward(args)...); } Ret вызова(Args... args) { return _function(std::forward(args)...); } частный: Ret (*_function)(Args...); std::uint16_t _method_id; }; но когда я вызвал BaseMethod bar_tempalte(adder, 0);
IDE выдала мне ошибку: слишком много аргументов для шаблона класса «BaseMethod»
Интересно, что не так с моим кодом? Спасибо!
У меня есть следующий класс шаблона, похожий на оболочку функции:
с использованием MethodId = std::uint16_t; шаблон класс BaseMethod { публика: BaseMethod(const Func &func, std::uint16_t Method_id): _function(func), _method_id(method_id) {} шаблон autooperator()(Args... args) -> decltype(_function(std::forward(args)...)) { return _function(std::forward(args)...); } шаблон автоматический вызов (Args... args) -> decltype(_function(std::forward(args)...)) { return _function(std::forward(args)...); } частный: Функ _функция; Идентификатор метода _идентификатор_метода; }; с этим шаблоном класса я могу использовать вот так:
int adder(int x, int y){return x+y;} BaseMethod foo_tempalte(adder, 0); но я также хочу поддержать такое использование:
BaseMethod bar_tempalte(adder, 0); Поэтому я добавляю частичную версию спецификации:
template класс BaseMethod { публика: BaseMethod(Ret (*func)(Args...), std::uint16_t метод_id): _function(func), _method_id(method_id) { } Оператор Ret()(Args... args) { return _function(std::forward(args)...); } Ret вызова(Args... args) { return _function(std::forward(args)...); } частный: Ret (*_function)(Args...); std::uint16_t _method_id; }; но когда я вызвал BaseMethod bar_tempalte(adder, 0);
IDE выдала мне ошибку: слишком много аргументов для шаблона класса «BaseMethod»
Интересно, что не так с моим кодом? Спасибо!
Мобильная версия