Tôi cố gắng để chuyên template theo cách sau:C++ template không do type tham số số học
template<size_t _1,size_t _2> // workaround: bool consecutive = (_1 == _2 - 1)>
struct integral_index_ {};
...
template<size_t _1>
struct integral_index_<_1, _1 + 1> { // cannot do arithmetic?
//struct integral_index_<_1, _2, true> { workaround
};
Tuy nhiên tôi nhận được biên dịch báo lỗi
the template argument list of the partial specialization includes a non
-type argument whose type depends on a template parameter.
những gì tôi làm sai? cảm ơn
Tôi đưa ra cách giải quyết trong nhận xét. Rõ ràng tôi không thể làm số học trong chuyên môn mẫu? có vẻ phản trực giác.
đây là giải pháp cuối cùng của tôi trong vấn đề cần giải quyết. Về cơ bản, chỉ số liên tiếp chỉ yêu cầu một phép nhân.
130 template<size_t _1,size_t _2, bool consecutive = (_1 == _2 - 1)>
131 struct integral_index_ {
132 template<typename T, typename U>
133 __device__
134 static T eval(const T (&N)[4], const U &index) {
135 T j = index/N[_1];
136 return ((index - j*N[_1])*range<0,_1>::multiply(N) +
137 j*range<0,_2>::multiply(N));
138 }
139 };
140
141 template<size_t _1,size_t _2>
142 struct integral_index_<_1, _2, true> {
143 template<typename T, typename U>
144 __device__
145 static T eval(const T (&N)[4], const U &index) {
146 return index*range<0,_1>::multiply(N);
147 }
148 };
149
150 template<size_t _1,size_t _2, typename T, typename U>
151 __device__
152 T integral_index(const T (&N)[4], const U &index) {
153 return integral_index_<_1,_2>::eval(N, index);
154 }
bức tranh lớn hơn một chút sẽ giúp đây. Bạn phải làm một chút thay đổi thiết kế để có được hiệu ứng tương tự. Ngoài ra, các số dòng có xu hướng cản trở. :) – GManNickG
@GMan Tôi cho rằng tôi có thể sử dụng đối số mặc định thêm, 'bool liên tiếp = _1 == _2 - 1'? – Anycorn
Tôi rất mong được nhìn thấy câu trả lời này. Nó sẽ nâng cao hiểu biết của tôi về ngôn ngữ. – Omnifarious