C++ 在部分专门化期间使用非类型模板参数
考虑以下结构: //其他地方提供的实现 结构A{ainti,double d,std::string s;/*…*/}; 结构B{Bdouble d1,double d2;/*…*/}; 我有两个转换类,其模板签名如下所示: 元组via1{…}; ArrayAsvia2{…}; 可以预见,TupleAs将int、double和std::string值的三元组转换为a类型的对象。类似地,ArrayAs将两个double值的对转换为B类型的对象。是的,我无法直接调用a和B构造函数是有原因的 改进语法 我想更改语法,以便执行以下操作: 元组C++ 在部分专门化期间使用非类型模板参数,c++,c++11,C++,C++11,考虑以下结构: //其他地方提供的实现 结构A{ainti,double d,std::string s;/*…*/}; 结构B{Bdouble d1,double d2;/*…*/}; 我有两个转换类,其模板签名如下所示: 元组via1{…}; ArrayAsvia2{…}; 可以预见,TupleAs将int、double和std::string值的三元组转换为a类型的对象。类似地,ArrayAs将两个double值的对转换为B类型的对象。是的,我无法直接调用a和B构造函数是有原因的 改进语法
template <unsigned N> using size_ = std::integral_constant<size_t, N>;
ArrayAs< B(double,size_<2>) >
甚至:
ArrayAs< B(std::array<double, 2>) >
从现在起,我们又回到了到处使用类型。不管你喜欢与否,这是个人的偏好
这里的关键是,当涉及到模板元编程的所有事情时,类型都是一流的公民,应该尽可能避免使用值
template <typename T> struct ArrayAs;
template <typename T, typename U, std::size_t N>
struct ArrayAs<T(std::array<U,N>)> { ... };
工程,以及:
template<class T>
struct to_array;
template<class T, size_t N>
struct to_array< T[N] > { using type = std::array<T, N>; };
template<class T>
using arr = typename to_array<T>::type;
然后:
遗憾的是,由于函数类型中的数组如何衰减为指针,直接使用ArrayAs
ArrayAs< B(std::array<double, 2>) >
template <typename T> struct ArrayAs;
template <typename T, typename U, std::size_t N>
struct ArrayAs<T(std::array<U,N>)> { ... };
template<class T>
struct to_array;
template<class T, size_t N>
struct to_array< T[N] > { using type = std::array<T, N>; };
template<class T>
using arr = typename to_array<T>::type;
ArrayAs< Bob( arr<int[3]> ) > some_var;