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

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/

    10-11 14:38
    查看更多