1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| #include <iostream>
// Structure intermediaire, n'est pas exposée à l'utilisateur
template<typename, int> struct xorand_dummy {};
// Version générale
template<int N, typename T> T inline xorand_(T* v1, T* v2, xorand_dummy<T,N>*)
{
return xorand_(v1, v2, (xorand_dummy<T,N/2>*)0) ^ xorand_(v1+N/2, v2+N/2, (xorand_dummy<T,N-N/2>*)0);
}
// Spécialisation pour N=1
template<typename T> T inline xorand_(T* v1, T* v2, xorand_dummy<T,1>*)
{
return v1[0] & v2[0];
}
// Fonction appelée par l'utilisateur
template<int N, typename T> T inline xorand(T* v1, T* v2)
{
return xorand_(v1, v2, (xorand_dummy<T,N>*)0);
}
int main()
{
int t1[6], t2[6];
for (size_t i = 0; i < 6; ++i)
{
t1[i] = i; t2[i] = 3*i;
}
std::cout << xorand<6>(t1, t2) << std::endl;
std::cout << xorand<1>(t1, t2) << std::endl;
return 0;
} |
Partager