【发布时间】:2016-11-18 16:31:46
【问题描述】:
我正在开发一个函数,该函数使用可变数量的参数调用提供的函数。它在 Visual Studio 2015 上编译并正常工作,但在 Clang 上编译失败。我准备了一个演示,展示了我正在尝试做的事情。我在 Clang 中遇到的错误是:
prog.cpp:在函数“int main()”中:prog.cpp:31:2:错误:没有匹配 调用 'run(std::vector&, void ()(int&, const int&), const int&)' ); ^ prog.cpp:7:6: 注意:候选人: 模板无效 运行(std::vector&, const std::function&, mutrArgs ...) 无效运行( ^ prog.cpp:7:6:注意:模板参数推导/替换失败:prog.cpp:31:2:注意:不匹配的类型'const std::function' 和 '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,而是将类型也设为模板,就像所有standard algorithm functions一样。 -
在非演示函数中,需要接受一定数量的参数。
-
如果你使用
std::function<void(int&,const int&)>(&adder),它会编译。不知道为什么需要指定它。可能与不可扣除的包装部分有关,但我不确定规则。 -
或者如果你通过函数指针传递
run<2, const int&>,它也可以工作Demo -
使用
std::function<decltype(adder)>(adder)编译 clang++ 3.5 和 g++ 4.9.2