别名可变参数模板函数

时间:2014-06-20 15:03:59

标签: c++ templates c++11 variadic-templates c++14

我有一个可变函数,如:

void test(int){}

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

我想将其别名为:

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

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

是否可以为可变参数函数设置别名?

3 个答案:

答案 0 :(得分:4)

在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;
}

或者用另一个可变参数函数和std::forward参数包装它:

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

答案 1 :(得分:1)

你所尝试的与

没什么不同
void test(int)
{
}

void test(double, int)
{
}

auto a = test;

编译器无法检测您要使用的过载。

您可以通过以下方式明确指出要test a的内容:

auto a = (void(*)(int))test;

如果要将混合模板版本添加到混合中,可以使用:

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

auto a = test<int, int, int>;

答案 2 :(得分:0)

这不是别名。auto a = test尝试声明与test具有相同类型的变量a并使它们相等。由于测试不是单个函数,而是函数模板(并且最重要的是你甚至可以重载函数),编译器无法确定应该是什么类型的函数。

要为模板添加别名,或者事实上任何符号,您都可以使用using关键字。

using a = test;

编辑:抱歉,这只适用于非功能类型。