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)...);
}