#include <iostream>
#include <array>
#include <vector>
using namespace std;
// Currently I have code much like this one:
template <const uint32_t N>
using VectorN = array<double, N>;
template <const uint32_t N>
class ITransformable {
public:
virtual vector<VectorN<N>>& positions() = 0;
};
class SomeTransformer {
public:
template <const uint32_t N>
void operator()(ITransformable<N>& transformable) const {
/* implementation */
}
};
// Then I want to create interface like this.
template <const uint32_t N>
class ITransformer {
public:
virtual void operator()(ITransformable<N>& transformable) const = 0;
};
// And finally implement it for SomeTransformer:
//
// Notice that class is not template, this is intentional.
//
// class SomeTransformer : public ITransformer<N> {
// public:
// virtual void operator()(ITransformable<N>& transformable) const {
// /* implementation */
// }
// }
На самом деле, сейчас это кажется мне невозможным. В противном случае этот класс наследовал бы неограниченное количество специализаций интерфейса ...
Но все же возможно ли это, по крайней мере, для конечного числа измерений N ?
template <template <typename> class C>
кажется, связано, но я не могу понять, как применить это.
РЕДАКТИРОВАТЬ То, что я хочу, выглядит примерно так:
class SomeTransformer :
public ITransformer<2>,
public ITransformer<3>,
public ITransformer<4>,
...,
public ITransformer<N> {
/* ... */
};
Для любого N когда-либо использовался в коде. Как я уже сказал, это кажется невозможным.