我是可变参数模板的新手,为了学习,请考虑以下功能
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;
}
我有两个问题:
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/