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吗
by
Func
或者可能
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);
..