Ich versuche Vorlage die folgende Art und Weise zu spezialisieren:C++ Template untypische Konstruktionen Parameter Arithmetik
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
};
aber ich Compiler Fehlermeldung erhalten
the template argument list of the partial specialization includes a non
-type argument whose type depends on a template parameter.
Was tun meine falsch? danke
Ich habe Workaround in Kommentaren. Anscheinend kann ich in der Template-Spezialisierung nicht rechnen. scheint kontraintuitiv zu sein.
Hier ist meine endgültige Lösung in dem Problem zu lösen. Im Grunde benötigt aufeinanderfolgender Index nur eine Multiplikation.
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 }
etwas größer Bild würde hier helfen. Sie müssen ein bisschen Design ändern, um den gleichen Effekt zu erzielen. Auch die Zeilennummern stehen tendenziell im Weg. :) – GManNickG
@GMan Ich nehme an, ich kann extra Standardargument verwenden, 'bool konsekutiv = _1 == _2 - 1'? – Anycorn
Ich freue mich darauf, dieses beantwortet zu sehen. Es wird mein Verständnis der Sprache verbessern. – Omnifarious