Я работаю над функцией, которая вызывает предоставленную функцию с переменным числом аргументов. Он компилируется и работает корректно на Visual Studio 2015, но не компилируется на Clang. Я подготовил демонстрацию, которая показывает, что я пытаюсь сделать. Я получаю ошибку в Clang является:Template Parameter Pack Fails on Clang, но не VS 2015
prog.cpp: In function 'int main()': prog.cpp:31:2: error: no matching function for call to 'run(std::vector&, void ()(int&, const int&), const int&)' ); ^prog.cpp:7:6: note: candidate: template void run(std::vector&, const std::function&, mutrArgs ...) void run( ^prog.cpp:7:6: note: template argument deduction/substitution failed: prog.cpp:31:2: note: mismatched types 'const std::function' and 'void ()(int&, const int&)' );
#include <functional>
#include <iostream>
#include <vector>
using namespace std;
template<int RepeatTimes, class ... mutrArgs>
void run(
vector<int>& vec,
const function<void(int&, mutrArgs ...)>& mutr,
mutrArgs ... args
)
{
for (int times{0} ; times < RepeatTimes ; ++times)
for (auto& item : vec)
mutr(item, args...);
}
void adder(int& i, const int& val)
{
i += val;
}
int main()
{
vector<int> v{0,1,2,3,4,5,6,7,8,9};
const int addValue{4};
run<2, const int&>(
v,
&adder,
addValue
);
for (auto i : v)
cout << i << " ";
cout << endl;
return 0;
}
Вместо использования 'std :: function', также создайте шаблон, как и все [стандартные функции алгоритма] (http://en.cppreference.com/w/cpp/algorithm). –
В не демонстрационной функции требуется принять заданное количество аргументов. – JadziaMD
Если вы используете 'std :: function (& adder)' компилируется. Не уверен, почему это нужно уточнить. Возможно, часть пакета не будет выводимой, но я не уверен в правилах. –
NathanOliver