我是可变参数模板的新手,为了学习起见,请考虑以下功能
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...))
获取类型
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句