Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/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++_Function_Templates_Type Deduction_Template Argument Deduction - Fatal编程技术网

C++ 如何使用类型特征正确推导引用参数

C++ 如何使用类型特征正确推导引用参数,c++,function,templates,type-deduction,template-argument-deduction,C++,Function,Templates,Type Deduction,Template Argument Deduction,我试图计算模板传递的方法签名中的参数数。 我想知道参数的数量,因为这个方法被包装到一个通用的lamda中,根据传递的参数的数量,我将向这里传递的方法添加更多的信息 我已经把这个问题孤立在下面。下面的snippit按预期工作,但一旦我更改result方法以引用该方法,它就无法编译。为什么参数类型上的引用会影响类型?我怎样才能让推荐信起作用 使用Microsoft Visual Studio 2017对此进行了测试 #包括“pch.h” #包括 模板 结构功能特征; 模板 结构函数特性{ 静态con

我试图计算模板传递的方法签名中的参数数。 我想知道参数的数量,因为这个方法被包装到一个通用的lamda中,根据传递的参数的数量,我将向这里传递的方法添加更多的信息

我已经把这个问题孤立在下面。下面的snippit按预期工作,但一旦我更改result方法以引用该方法,它就无法编译。为什么参数类型上的引用会影响类型?我怎样才能让推荐信起作用

使用Microsoft Visual Studio 2017对此进行了测试

#包括“pch.h”
#包括
模板
结构功能特征;
模板
结构函数特性{
静态constexpr uint32参数计数=sizeof…(TArgs);
};
类TestClass{
公众:
//编译错误!!!
//错误C2027:使用未定义的类型“func_traits”
//uint32_t结果(常数方法和函数)
模板
uint32_t结果(常量方法函数){
返回(func_traits::ARG_COUNT);
}
};
无效foo(内部a、内部b、内部c)
{
}
整型条()
{
返回0;
}
内特巴兹(双人)
{
返回0;
}
int main()
{
测试类设备;

std::cout您的示例中的场景非常罕见,并且与特定于函数和数组的模板规则相关

若要详细说明是否有一个模板函数通过引用获取另一个函数,则为T推导的类型是实际的函数类型(而不是指向函数的指针)。 例如

template<typename T>
void fun(const T& f);
{
.....
}
void print(int);
fun(print); //for this case T will be deduced as void(int) and not void(*)int i.e. T will not be a function pointer
模板
虚无乐趣(康斯特T&f);
{
.....
}
空白打印(int);
fun(print);//对于这种情况,T将被推断为void(int)而不是void(*)int,即T将不是函数指针
因此,为了使您的示例适用于参考案例,您必须再创建一个模板专门化,如:

template <typename R, typename... TArgs>
struct func_traits<R(TArgs...)> {
    static constexpr uint32_t ARG_COUNT = sizeof...(TArgs);
};  //note (*) is removed from template function
模板
结构函数特性{
静态constexpr uint32参数计数=sizeof…(TArgs);
};//注意(*)已从模板函数中删除
简而言之,如果您按值传递函数或数组,则它们将衰减到指针,但如果您按引用传递,则它们将按原样处理。 在Scott Meyers有效的现代C++()

中有更多的细节可用。