混叠可变模板函数 [英] aliasing a variadic template function

查看:129
本文介绍了混叠可变模板函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个可变函数,如:

  void test(int){} 

template< ; typename T,typename ... Args>
无效测试(int& sum,T v,Args ... args)
{
sum + = v;
test(sum,args ...);
}

我想把它命名为:

  auto sum = test; //错误:无法从测试中推导出auto 
int main()
{
int res = 0;
test(res,4,7);
std :: cout<< res;
}

我尝试使用 std :: bind 但是它不适用于可变参数,因为它需要占位符...



是否可以对可变参数赋值?


include< iostream>

void test(int){}

template< typename T,typename ... Args>
void test(int& sum,T v,Args ... args)
{
sum + = v;
test(sum,args ...);
}

template< typename T,typename ... Args>
decltype(test< T,Args ...>)* sum =&(test< T,Args ...>);

int main(void)
{
int res = 0;
sum< int,int>(res,4,7);
std :: cout<< res<< std :: endl;
}

或者用另一个变量函数和 std: :forward 参数:

  template< typename T,typename ... Args> 
void other(int& sum,T v,Args& ... args)
{
test(sum,std :: move(v),std :: forward& ;(args)...);
}


I have a variadic function like :

void test(int){}

template<typename T,typename...Args>
void test(int& sum,T v,Args... args)
{
    sum+=v;
    test(sum,args...);
}

I want to alias it to something like :

auto sum = test;//error : can not deduce auto from test
int main()
{
    int res=0;
    test(res,4,7);
    std::cout<<res;
}

I tried using std::bind but it doesn't work with variadic functions because it needs placeholders ...

Is it possible to alias a variadic function ?

解决方案

In C++1y :

#include <iostream>

void test(int){}

template<typename T,typename...Args>
void test(int& sum,T v,Args... args)
{
  sum+=v;
  test(sum,args...);
}

template<typename T,typename...Args>
decltype(test<T, Args...>)* sum = &(test<T, Args...>);

int     main(void)
{
  int   res = 0;
  sum<int, int>(res, 4, 7);
  std::cout << res << std::endl;
}

Alternatively wrap it in another variadic function and std::forward the arguments :

template<typename T,typename...Args>
void    other(int&sum, T v, Args&&... args)
{
  test(sum, std::move(v), std::forward<Args>(args)...);
}

这篇关于混叠可变模板函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆