Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可变模板函数的混叠_C++_Templates_C++11_Variadic Templates_C++14 - Fatal编程技术网

C++ 可变模板函数的混叠

C++ 可变模板函数的混叠,c++,templates,c++11,variadic-templates,c++14,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...); } void测试(int){ 模板 无效测试(整数和总和、tV、Args…Args) { 总和+=v; 测试(总和、参数…); } 我想将其别名为: auto sum = test;//erro

我有一个可变函数,如:

void test(int){}

template<typename T,typename...Args>
void test(int& sum,T v,Args... args)
{
    sum+=v;
    test(sum,args...);
}
void测试(int){
模板
无效测试(整数和总和、tV、Args…Args)
{
总和+=v;
测试(总和、参数…);
}
我想将其别名为:

auto sum = test;//error : can not deduce auto from test
int main()
{
    int res=0;
    test(res,4,7);
    std::cout<<res;
}
自动求和=测试//错误:无法从测试中推断自动
int main()
{
int res=0;
试验(res,4,7);

std::cout您正在尝试的与

void test(int)
{
}

void test(double, int)
{
}

auto a = test;
编译器无法检测要使用的重载

您可以通过以下方式明确指定给
a
test

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>;
模板
无效测试(整数和总和、tV、Args…Args)
{
总和+=v;
测试(总和、参数…);
}
自动a=测试;

这不是别名。
auto a=test
尝试声明一个与
test
类型相同的变量a,并使它们相等。由于test不是一个函数,而是一个函数模板(最重要的是,您甚至可以重载函数),编译器无法决定a的类型

要为模板或任何符号添加别名,可以使用
using
关键字

using a = test;
编辑:抱歉,此选项仅适用于类型而不适用于函数。

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

auto-sum=[](auto&&…pp){return test(std::forward(pp);};
或类似的东西。但它不是真正的别名;例如,如果他想要
test(double,int),您不能在本例中使用
auto x=&sum;
,他能做到这一点:我知道,我在寻找一种对变量函数进行序列化的方法。@dyp solutions似乎与gcc 4.9一起工作,它没有回答问题。顺便说一句,auto a=test;
不起作用:对于三个参数,你使用
auto a=test
@awesomeyi我需要一些在一般情况下有效的东西,我的问题是j我的代码是简化版本的,我不能用Autoto所有可能的方法!你不能用模板来混淆模板函数!是的,我的坏,但是你可以别名为一个函子。那么,目前C++中是不可能的。有趣的是,我怀疑类型推断会对这个“别名”起作用。“dyp目前不与通常的编译器,但也许有一天不远:”嗯,我怀疑可变模板的语法会支持这个;因为定义的模板没有与函数调用的参数匹配的模式。请考虑变量模板的专门化。只有在非常受限的上下文中,变量才可以。late可能被视为别名,编译器必须“检查”这一抽象层。
std::forward(v)
不是必需的,因为
tv
不是通用的参考。
std::move(v)
就足够了。@dyp updated:)至于演绎,我同意你的看法,尽管尝试自动演绎的一个明显的例子是在变量模板上调用运算符()时,这意味着它很可能是一个可调用的,可以通过该调用完全演绎。但我不是一个编译器编写者,所以这完全是推测^^
template<typename T,typename...Args>
void    other(int&sum, T v, Args&&... args)
{
  test(sum, std::move(v), std::forward<Args>(args)...);
}