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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| #include <iostream>
#include <vector>
template<size_t... Indices>
struct indices {
typedef indices<Indices..., sizeof...(Indices)> next;
};
template<size_t N>
struct build_indices {
typedef typename build_indices<N - 1>::type::next type;
};
template<>
struct build_indices<0> {
typedef indices<> type;
};
struct AbsMatrix {
virtual void svd() = 0;
virtual ~AbsMatrix() { }
};
template <class T, size_t N, size_t M>
struct FMatrix : public AbsMatrix {
void svd() {
std::cout << "blah\n";
}
};
template <class T, size_t N, size_t M>
AbsMatrix *createWrapper() {
return new FMatrix<T, N, M>();
}
template<class T, size_t... Indices>
AbsMatrix *createMat(size_t i, indices<Indices...>) {
static AbsMatrix* (*lookup[])() = {
&createWrapper<T, Indices, Indices>...
};
return lookup[i]();
}
template <class T>
AbsMatrix *createMat(size_t i) {
// 500 fixé arbitrairement, et doit être >= à vector.size()
return createMat<T>(i, typename build_indices<500>::type());
}
int main() {
std::vector<int> vi;
vi.push_back(42);
vi.push_back(14);
AbsMatrix *mat = createMat<decltype(vi[0])>(vi.size());
mat->svd();
return 0;
} |
Partager