В приведенном ниже примере кода я пытаюсь проверить, являются ли аргументы функции указателями или нет с 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;
}
Полагаю, если параметры не являются ни указателями, ни указателями, то у нас возникает дополнительная проблема, но давайте просто предположим, что все аргументы являются либо указателями, либо нет.
тогда как насчет того, чтобы аргументы были смесью указателей и не указателей в любом случае?