首先,您需要这些头文件:
#include <type_traits>
#include <tuple>
那么,让我们声明可变参数模板来检测类型是否相同:
template <typename ... args>
struct all_same : public std::false_type {};
template <typename T>
struct all_same<T> : public std::true_type {};
template <typename T, typename ... args>
struct all_same<T, T, args...> : public all_same<T, args ... > {};
现在我们可以使用static_assert
来检测参数类型是否相同:
template <typename T, typename... args>
T* make_arr(args... arg) {
static_assert(all_same<args ...>::value, "Params must have same types");
T* arr = new T[sizeof...(arg)]{ arg... };
return arr;
};
最后,让我们将函数的返回类型作为参数的第一个类型 - 如果所有类型都相同,我们可以任选其中一个。我们使用std::tuple
来实现此功能。
template <typename... args>
typename std::tuple_element<0, std::tuple<args...> >::type * make_arr(args... arg) {
static_assert(all_same<args ...>::value, "Params must have same types");
typedef typename std::tuple_element<0, std::tuple<args...> >::type T;
T* arr = new T[sizeof...(arg)]{ arg... };
return arr;
};
typeid
函数了吗? - seleciii44args
的类型 彼此相同,并且可能与T
不同吗?或者你希望它们都与T
相同的类型?或者你允许它们彼此不同,但只要能够使用可以转换为T
的类型构建T
数组即可? - Aaron McDaid