gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:10:37 26 4
gpt4 key购买 nike

我正在尝试计算模板传递的方法签名中的参数数量。我想知道参数的数量,因为此方法被包装到通用 lamda 中,并且根据传递的参数数量,我将向此处传递的方法添加更多信息。

我已将问题隔离到下面的代码片段中。下面的代码片段按预期工作,但是一旦我更改结果方法以引用 METHOD,它就无法编译。为什么参数类型的引用会影响类型?我怎样才能让它与引用一起工作?

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

#include "pch.h"
#include <iostream>

template <typename Func>
struct func_traits;

template <typename R, typename... TArgs>
struct func_traits<R(*)(TArgs...)> {
static constexpr uint32_t ARG_COUNT = sizeof...(TArgs);
};

class TestClass {
public:
// Compile error!!!
// error C2027: use of undefined type 'func_traits<METHOD>'
// uint32_t Result(const METHOD& function)

template <typename METHOD>
uint32_t Result(const METHOD function) {
return (func_traits< METHOD >::ARG_COUNT);
}
};


void foo(int a, int b, int c)
{
}

int bar()
{
return 0;
}

int baz(double)
{
return 0;
}

int main()
{
TestClass device;

std::cout << device.Result(foo) << std::endl;
std::cout << device.Result(bar) << std::endl;
std::cout << device.Result(baz) << std::endl;
return 0;

}

最佳答案

您的示例中的场景非常罕见,并且与特定的模板规则有关,特别是与函数和数组相关。

要详细说明,如果您有一个模板函数,它通过引用获取另一个函数,那么为 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

因此,为了让您的示例适用于引用案例,您必须再创建一个模板特化,例如:

template <typename R, typename... TArgs>
struct func_traits<R(TArgs...)> {
static constexpr uint32_t ARG_COUNT = sizeof...(TArgs);
}; //note (*) is removed from template function

简而言之,如果您按值传递函数或数组,那么它们将衰减为指针,但如果您按引用传递,则它们将按原样处理。更多详细信息,请参阅 Scott Meyers Effective Modern C++ ( https://www.oreilly.com/library/view/effective-modern-c/9781491908419/ch01.html )

关于c++ - 如何使用类型特征正确推导出引用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56346400/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com