#include <vector>
#include <memory>
#include <iostream>
struct Vector2f{ float x, y; };
struct Vector3f{ float x, y, z; };
struct Tensor3f{ float xx, xy, xz, yy, yz, zz; };
struct Matrix3x3f{ float data[9]; };
struct Space2
{
typedef Vector2f Vector;
};
struct Space3
{
typedef Vector3f Vector;
};
//
// Particle.h
// Выносим в отдельный заголовок
//
template<typename T>
struct ParticleData{};
template<typename Space>
struct Particle : public ParticleData<Space>
{
typename Space::Vector pos, velocity;
};
//
// ParticleSystem.h
// Здесь ни какой информации о Particle
//
template<typename Space>
struct ParticleSystem
{
void DumpParticles();
struct Implementation;
std::unique_ptr<Implementation> me;
};
//
// ParticleSystem.cpp
//
template<>
struct ParticleData<Space2>
{
float orientation;
float invInertia;
};
template<>
struct ParticleSystem<Space2>::Implementation
{
void DumpParticle()
{
printf("%f %f", particles[0].orientation, particles[0].invInertia);
}
std::vector<Particle<Space2>> particles;
};
template<typename Space>
void ParticleSystem<Space>::DumpParticles()
{
me->DumpParticle();
}
int main()
{
ParticleSystem<Space2> p2;
return 0;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IFZlY3RvcjJmeyBmbG9hdCB4LCB5OyB9OwpzdHJ1Y3QgVmVjdG9yM2Z7IGZsb2F0IHgsIHksIHo7IH07CnN0cnVjdCBUZW5zb3IzZnsgZmxvYXQgeHgsIHh5LCB4eiwgeXksIHl6LCB6ejsgfTsKc3RydWN0IE1hdHJpeDN4M2Z7IGZsb2F0IGRhdGFbOV07IH07CnN0cnVjdCBTcGFjZTIKewogICAgdHlwZWRlZiBWZWN0b3IyZiBWZWN0b3I7Cn07CnN0cnVjdCBTcGFjZTMKewogICAgdHlwZWRlZiBWZWN0b3IzZiBWZWN0b3I7Cn07CgoKLy8KLy8gUGFydGljbGUuaAovLyDQktGL0L3QvtGB0LjQvCDQsiDQvtGC0LTQtdC70YzQvdGL0Lkg0LfQsNCz0L7Qu9C+0LLQvtC6Ci8vCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnN0cnVjdCBQYXJ0aWNsZURhdGF7fTsKCnRlbXBsYXRlPHR5cGVuYW1lIFNwYWNlPgpzdHJ1Y3QgUGFydGljbGUgOiBwdWJsaWMgUGFydGljbGVEYXRhPFNwYWNlPgp7CiAgICB0eXBlbmFtZSBTcGFjZTo6VmVjdG9yIHBvcywgdmVsb2NpdHk7Cn07CgoKLy8KLy8gUGFydGljbGVTeXN0ZW0uaAovLyDQl9C00LXRgdGMINC90Lgg0LrQsNC60L7QuSDQuNC90YTQvtGA0LzQsNGG0LjQuCDQviBQYXJ0aWNsZQovLwp0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFjZT4Kc3RydWN0IFBhcnRpY2xlU3lzdGVtCnsKICAgIHZvaWQgRHVtcFBhcnRpY2xlcygpOwoKICAgIHN0cnVjdCBJbXBsZW1lbnRhdGlvbjsKICAgIHN0ZDo6dW5pcXVlX3B0cjxJbXBsZW1lbnRhdGlvbj4gbWU7Cn07CgovLwovLyBQYXJ0aWNsZVN5c3RlbS5jcHAKLy8KdGVtcGxhdGU8PgpzdHJ1Y3QgUGFydGljbGVEYXRhPFNwYWNlMj4KewogICAgZmxvYXQgb3JpZW50YXRpb247CiAgICBmbG9hdCBpbnZJbmVydGlhOwp9Owp0ZW1wbGF0ZTw+CnN0cnVjdCBQYXJ0aWNsZVN5c3RlbTxTcGFjZTI+OjpJbXBsZW1lbnRhdGlvbgp7CiAgICB2b2lkIER1bXBQYXJ0aWNsZSgpCiAgICB7CiAgICAgICAgcHJpbnRmKCIlZiAlZiIsIHBhcnRpY2xlc1swXS5vcmllbnRhdGlvbiwgcGFydGljbGVzWzBdLmludkluZXJ0aWEpOwogICAgfQogICAgc3RkOjp2ZWN0b3I8UGFydGljbGU8U3BhY2UyPj4gcGFydGljbGVzOwp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgU3BhY2U+CnZvaWQgUGFydGljbGVTeXN0ZW08U3BhY2U+OjpEdW1wUGFydGljbGVzKCkKewogICAgbWUtPkR1bXBQYXJ0aWNsZSgpOwp9CgppbnQgbWFpbigpCnsKICAgIFBhcnRpY2xlU3lzdGVtPFNwYWNlMj4gcDI7CiAgICByZXR1cm4gMDsKfQ==