C++ 将引用传递给可变模板使用std::reference包装器
我尝试将引用列表传递给可变模板函数,并将其传递给另一个函数。我编写的代码如下:C++ 将引用传递给可变模板使用std::reference包装器,c++,c++11,variadic-templates,reference-wrapper,C++,C++11,Variadic Templates,Reference Wrapper,我尝试将引用列表传递给可变模板函数,并将其传递给另一个函数。我编写的代码如下: template <typename T> void fun(cv::Point_<T> & pt) { pt.x++; pt.y++; } template <class ... args> void caller(args & ... list) { typedef typename std::tuple_element<0, std::tup
template <typename T>
void fun(cv::Point_<T> & pt) { pt.x++; pt.y++; }
template <class ... args>
void caller(args & ... list) {
typedef typename std::tuple_element<0, std::tuple<args...> >::type T;
std::array<std::reference_wrapper<T>, sizeof...(list)> values {list ... };
for(int i=0; i<values.size(); i++)
fun(values[i]);
}
编译器给了我以下错误:
No matching function for call to 'fun'
Candidate template ignored: could not match 'Point_' against 'reference_wrapper'
我缺少什么?尽管
std::reference\u wrapper
具有到T&
的隐式转换,但不能同时使用隐式转换和模板参数推断,并且模板参数推断是调用乐趣所必需的
试一试
尽管std::reference\u wrapper
具有到T&
的隐式转换,但不能同时使用隐式转换和模板参数推断,并且模板参数推断是调用fun
所必需的
试一试
由于其目标可能是迭代所有参数
,因此这里有一个更通用的解决方案。我们将为_-pack实施:
template<typename... Args, typename F>
void for_pack(F function, Args&&... args) {
using expand = int[];
(void)expand{(function(std::forward<Args>(args)), void(), 0)..., 0};
}
由于其目标可能是迭代所有参数
,因此这里有一个更通用的解决方案。我们将为_-pack实施:
template<typename... Args, typename F>
void for_pack(F function, Args&&... args) {
using expand = int[];
(void)expand{(function(std::forward<Args>(args)), void(), 0)..., 0};
}
更简单的是
template <typename...Args>
void caller(Args&...args)
{
auto tmp = { (func(args),0)..., 0 };
}
可以这样使用(C++14)
intmain()
{
INTA=1;
双b=2.4;
auto func=[](auto&x){std::cout甚至更简单
template <typename...Args>
void caller(Args&...args)
{
auto tmp = { (func(args),0)..., 0 };
}
可以这样使用(C++14)
intmain()
{
INTA=1;
双b=2.4;
auto-func=[](auto&x){std::cout由于谷歌搜索“c++将引用参数传递给变量模板”会给出第一个结果,所以我将把这个通用解决方案放在这里
struct HH { /*...*/ void change_me() { /*...*/ } };
template<typename...T> void parms_r_refs() {}
template<typename H, typename...T> void parms_r_refs(H &h, T&...t) { h.change_me(); parms_r_refs(t...); }
template<typename...T> void parms_r_refs(T&...t) { parms_r_refs(t...); }
HH a, b, c;
..
parms_r_refs(a, b, c);
..
struct HH{/*…*/void change_me(){/*…*/};
模板void parms_r_refs(){}
模板void parms_r_refs(H&H,T&…T){H.change_me();parms_r_refs(T…;}
模板void parms_r_refs(T&…T){parms_r_refs(T…);}
HH a,b,c;
..
参考文献(a、b、c);
..
由于谷歌搜索“c++将引用参数传递到可变模板”给出了第一个结果,所以我将把这个通用解决方案放在这里
struct HH { /*...*/ void change_me() { /*...*/ } };
template<typename...T> void parms_r_refs() {}
template<typename H, typename...T> void parms_r_refs(H &h, T&...t) { h.change_me(); parms_r_refs(t...); }
template<typename...T> void parms_r_refs(T&...t) { parms_r_refs(t...); }
HH a, b, c;
..
parms_r_refs(a, b, c);
..
struct HH{/*…*/void change_me(){/*…*/};
模板void parms_r_refs(){}
模板void parms_r_refs(H&H,T&…T){H.change_me();parms_r_refs(T…;}
模板void parms_r_refs(T&…T){parms_r_refs(T…);}
HH a,b,c;
..
参考文献(a、b、c);
..
你想做什么?引用包装似乎只是多余的。你真的想为每个参数调用fun
吗?或多或少是的。但是我问题中的代码是对真实参数的简化。你想做什么?引用包装似乎只是多余的。你真的想调用fun吗
对于每个参数?或多或少是的。然而,我问题中的代码是对真实参数的简化。确实有效。但是,对我来说,它就像阿拉姆语。但是对于不是无效的,我需要求返回值的和吗?@Walter似乎调用每个
都不能接受可变lambda。你介意替换funct const&Func吗
byFunc
或者可能Func&Func
?谢谢。但是,对我来说,它就像阿拉姆语。但是,它不是空的,我需要求返回值的和吗?@Walter似乎调用每个
都不能接受可变lambda。你介意用Func
替换Func常量&Func
吗也许Func&&Func
?谢谢。你不需要void(),
或所有展开的东西,请看我的答案。@Walter是的,你需要void()
。如果函数
碰巧返回了一个重载操作符的对象,(int)
,它可能会导致严重的编译错误。顺便说一句,您的解决方案应该会触发一个关于未使用tmp
的警告。您不需要void(),
或所有expand
内容,请参阅我的答案。@Walter是的,您需要void()
。如果函数
碰巧返回一个重载运算符(int)
的对象,可能会导致严重的编译错误。顺便说一句,您的解决方案应该触发一个关于未使用tmp
的警告。
int main()
{
int a=1;
double b=2.4;
auto func = [](auto&x) { std::cout<<' '<<x++; };
call_for_each(func,a,b);
std::cout<<'\n';
call_for_each(func,a,b);
std::cout<<'\n';
}
struct HH { /*...*/ void change_me() { /*...*/ } };
template<typename...T> void parms_r_refs() {}
template<typename H, typename...T> void parms_r_refs(H &h, T&...t) { h.change_me(); parms_r_refs(t...); }
template<typename...T> void parms_r_refs(T&...t) { parms_r_refs(t...); }
HH a, b, c;
..
parms_r_refs(a, b, c);
..