gpt4 book ai didi

c++ - 如何检查传递给可变参数函数的参数类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:23 26 4
gpt4 key购买 nike

我是可变参数模板的新手,为了学习考虑以下函数

template <typename T, typename... args>
T* make_arr(args... arg) {

// Code to check if passed args are of the same type

T* arr = new T[sizeof...(arg)]{ arg... };
return arr;
}

我有两个问题:

  1. 我希望函数是模板化的,我希望传递的参数是同一类型,所以问题是:是否可以检查传递的参数是否是同一类型?
  2. 是否可以通过推断args...的类型来推断数组指针的类型? ,我的意思是不使用 <typename T> ? ... 我使用了 decltype(arg) 但它没有用 ...

注意:如果不合适请编辑标题问题...谢谢

最佳答案

我找到的唯一方法是使用 SFINAE 制作辅助函数

//Basic function
template<typename T>
void allsame(T) {}

//Recursive function
template<typename T, typename T2, typename... Ts,
typename = std::enable_if_t<std::is_same<T, T2>::value>>
void allsame(T arg, T2 arg2, Ts... args)
{
allsame(arg2, args...);
}

然后你可以这样调用它:

allsame(arg...);

如果类型不相同,编译器将抛出错误。


对于 2),您可以修改 allsame 以返回类型。此函数的唯一缺点是如果类型不是默认可构造的,它将无法工作。

template<typename T>
T allsame(T) { return{}; }

T allsame(T arg, T2 arg2, Ts... args)

然后,你可以decltype(allsame(args...))得到类型

关于c++ - 如何检查传递给可变参数函数的参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37236109/

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