在这个缩短的示例(非真实世界代码)中,我尝试使用Callback
调用int &
,但是,当通过CallMethod
方法进行调用时,模板参数为解释为int
,这意味着它无法将其转换为目标参数类型。
这可能吗?我知道在调用CallMethod
时我可以将参数强制转换为正确的类型,但是如果可能的话,我希望解决方案是隐式的。
#include <functional>
#include <iostream>
using namespace std;
void Callback(int &value)
{
value = 42;
}
template <typename Method, typename ...Params>
void CallMethod(Method method, Params ...params)
{
method(std::forward<Params>(params)...);
}
int main()
{
int value = 0;
CallMethod(&Callback, value);
cout << "Value: " << value << endl;
return 0;
}
答案 0 :(得分:6)
你没有正确转发你的论点。为了使用完美转发$keys = array(); // array date => index in result
$i = 0;
foreach($input as $item)
if (isset($keys[$item['date']])) // if exist
$result[$keys[$item['date']]]['nb'] += $item['nb']; // add value
else {
$keys[$item['date']] = $i; // create new items in arrays
$result[$i++] = $item;
}
print_r($result);
应该对转发引用进行操作,这是在推导的上下文中有rvalue引用时。您的std::forward
函数应如下所示:
CallMethod