在下面的示例代码中,我尝试使用std::is_pointer
检查函数参数是否为指针
如果只有一个参数,它可以正常工作,但是如何使其与更多参数一起使用,例如在参数包中?
#include <type_traits>
#include <iostream>
class Test
{
public:
template<typename... Params>
void f(Params... params);
template<typename T, typename... Params>
auto sum(T arg, Params... params)
{
return arg + sum(params...);
}
template<typename T>
auto sum(T arg)
{
return arg;
}
int member = 1;
};
template<typename... Params>
void Test::f(Params... params)
{
// ERROR: too many template arguments for std::is_pointer
if constexpr (std::is_pointer_v<Params...>)
member += sum(*params...);
else
member += sum(params...);
std::cout << member;
}
int main()
{
Test ts;
// both fail
ts.f(1, 2);
ts.f(&ts.member, &ts.member);
// is that even possible?
ts.f(&ts.member, 2);
return 0;
}
我猜如果参数不是全部不是指针,也不是全部不是指针,那么我们还有其他问题,但让我们假设所有参数都不是指针。
那如果参数仍然是指针和非指针的混合呢?
最佳答案
通过将对参数是否为指针的检测移到可变参数模板函数sum
中,可以简化问题(并使程序正常运行)。
例:
#include <type_traits>
#include <iostream>
class Test
{
public:
template<typename... Params>
void f(Params... params)
{
member += sum(params...);
std::cout << member << '\n';
}
template<typename... Params>
auto sum(Params... params)
{
auto contents = [](auto param)
{
using ParamType = std::decay_t<decltype(param)>;
if constexpr (std::is_pointer_v<ParamType>)
return *param;
else
return param;
};
return (contents(params) + ...);
}
int member = 1;
};
int main()
{
Test ts;
// both fail
ts.f(1, 2);
ts.f(&ts.member, &ts.member);
// is that even possible?
ts.f(&ts.member, 2);
return 0;
}
预期产量:
4
12
26
https://godbolt.org/z/y57-TA
关于c++ - 在模板参数包上使用类型特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59698976/