Я работаю над программой со следующей структурой:
#include <iostream>
#include <string>
void fun(const std::string &text, int a, int b) { // (1)
std::cout << text << a + b << std::endl;
}
template<typename ...Args>
void execute(void(*fun)(Args...), Args ...args) {
fun(args...);
}
void init(const std::string &text, int a, int b) {
execute(fun, text, a, b);
}
int main() {
init("Fun: ", 1, 2);
return 0;
}
и получаю сообщение об ошибке
.code.tio.cpp:14:2: error: no matching function for call to 'execute'
execute(fun, text, a, b);
^~~~~~~
.code.tio.cpp:9:6: note: candidate template ignored: deduced conflicting types for parameter 'Args' (<const std::__cxx11::basic_string<char> &, int, int> vs. <std::__cxx11::basic_string<char>, int, int>)
void execute(void(*fun)(Args...), Args ...args) {
^
1 error generated.
Я могу исправить ошибку, удалив ссылку в строке (1) :
void fun(const std::string text, int a, int b) {
, но я хочу передать значения по ссылке, а не по значению.Шаблон функции
template<typename ...Args>
void execute(void(*fun)(Args...), Args ...args)
не должен быть изменен.Как я могу это исправить, чтобы text
передавалось по ссылке, execute
не изменялось и init
также не изменялось, если это возможно?
РЕДАКТИРОВАТЬ: @super показал, что я ошибался, и у меня естьпереформулировать мои требования.execute
можно изменить только до такой степени, чтобы другие проекты, зависящие от этой функции, не ломались.Я не думал о таком решении.