#include <stdio.h>
#include <vector>
using namespace std;
struct Space2
{
struct Vector
{
};
};
struct Space3
{
struct Vector
{
};
};
template<typename Space,int COUNT>
struct ParticleSystem
{
struct ParticleData;
typedef typename ParticleSystem<Space,0>::ParticleData Particle;
void DumpParticle();
std::vector<Particle> particles;
ParticleSystem()
{
particles.push_back(Particle());
}
};
template<> struct ParticleSystem<Space2,0>::ParticleData
{
float orientation;
float invInertia;
ParticleData()
{
orientation = 2.0f ;
invInertia = 3.0f;
}
};
template<> struct ParticleSystem<Space3,0>::ParticleData
{
float test;
ParticleData()
{
test = 100500.0f;
}
};
template<>
void ParticleSystem<Space2,0>::DumpParticle()
{
printf("2: %f %f\n", particles[0].orientation, particles[0].invInertia );
}
template<>
void ParticleSystem<Space3,3>::DumpParticle()
{
printf("3: %f\n", particles[0].test);
}
int main()
{
ParticleSystem<Space3,3> p3;
ParticleSystem<Space2,0> p2;
p3.DumpParticle();
p2.DumpParticle();
return 0;
}
CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpzdHJ1Y3QgU3BhY2UyCnsKICAgIHN0cnVjdCBWZWN0b3IKICAgIHsKCiAgICB9OwoKfTsKc3RydWN0IFNwYWNlMwp7CiAgICBzdHJ1Y3QgVmVjdG9yCiAgICB7CgogICAgfTsKCn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFjZSxpbnQgQ09VTlQ+CnN0cnVjdCBQYXJ0aWNsZVN5c3RlbQp7CiAgc3RydWN0IFBhcnRpY2xlRGF0YTsKICB0eXBlZGVmIHR5cGVuYW1lIFBhcnRpY2xlU3lzdGVtPFNwYWNlLDA+OjpQYXJ0aWNsZURhdGEgUGFydGljbGU7IAogICAgdm9pZCBEdW1wUGFydGljbGUoKTsKICAgIHN0ZDo6dmVjdG9yPFBhcnRpY2xlPiBwYXJ0aWNsZXM7CiAgICBQYXJ0aWNsZVN5c3RlbSgpCiAgICB7CiAgICAgICAgcGFydGljbGVzLnB1c2hfYmFjayhQYXJ0aWNsZSgpKTsKICAgIH0KfTsKCnRlbXBsYXRlPD4gc3RydWN0IFBhcnRpY2xlU3lzdGVtPFNwYWNlMiwwPjo6UGFydGljbGVEYXRhCnsKICAgIGZsb2F0IG9yaWVudGF0aW9uOwogICAgZmxvYXQgaW52SW5lcnRpYTsKICAgIFBhcnRpY2xlRGF0YSgpCiAgICB7CiAgICAgICAgb3JpZW50YXRpb24gPSAyLjBmIDsKICAgICAgICBpbnZJbmVydGlhID0gMy4wZjsKICAgIH0KfTsKCgp0ZW1wbGF0ZTw+IHN0cnVjdCBQYXJ0aWNsZVN5c3RlbTxTcGFjZTMsMD46OlBhcnRpY2xlRGF0YQp7CiAgICBmbG9hdCB0ZXN0OwogICAgUGFydGljbGVEYXRhKCkKICAgIHsKICAgICAgICB0ZXN0ID0gMTAwNTAwLjBmOwogICAgfQp9OwoKdGVtcGxhdGU8Pgp2b2lkIFBhcnRpY2xlU3lzdGVtPFNwYWNlMiwwPjo6RHVtcFBhcnRpY2xlKCkKewogICAgcHJpbnRmKCIyOiAlZiAlZlxuIiwgcGFydGljbGVzWzBdLm9yaWVudGF0aW9uLCBwYXJ0aWNsZXNbMF0uaW52SW5lcnRpYSApOwp9Cgp0ZW1wbGF0ZTw+CnZvaWQgUGFydGljbGVTeXN0ZW08U3BhY2UzLDM+OjpEdW1wUGFydGljbGUoKQp7CiAgICBwcmludGYoIjM6ICVmXG4iLCBwYXJ0aWNsZXNbMF0udGVzdCk7Cn0KaW50IG1haW4oKQp7CiAgICBQYXJ0aWNsZVN5c3RlbTxTcGFjZTMsMz4gcDM7CiAgICBQYXJ0aWNsZVN5c3RlbTxTcGFjZTIsMD4gcDI7CiAgICBwMy5EdW1wUGFydGljbGUoKTsKICAgIHAyLkR1bXBQYXJ0aWNsZSgpOwogICAgcmV0dXJuIDA7Cn0K