C++ 如何使用类型特征正确推导引用参数
我试图计算模板传递的方法签名中的参数数。 我想知道参数的数量,因为这个方法被包装到一个通用的lamda中,根据传递的参数的数量,我将向这里传递的方法添加更多的信息 我已经把这个问题孤立在下面。下面的snippit按预期工作,但一旦我更改result方法以引用该方法,它就无法编译。为什么参数类型上的引用会影响类型?我怎样才能让推荐信起作用 使用Microsoft Visual Studio 2017对此进行了测试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
#包括“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++()中有更多的细节可用。