#include <stdio.h>
#include <vector>
using namespace std;
struct Space2
{
struct Vector
{
};
};
struct Space3
{
struct Vector
{
};
};
template<typename Space>
struct ParticleData{};
template <>
struct ParticleData<Space2>
{
float orientation;
float invInertia;
ParticleData()
{
orientation = 2.0f ;
invInertia = 3.0f;
}
};
template <>
struct ParticleData<Space3>
{
float test;
ParticleData()
{
test = 100500.0f;
}
};
template<typename T>
struct Dumper
{
};
template <typename T>
struct Overload{};
template<typename Space,typename AwesomeParam>
struct ParticleSystem
{
struct Particle : public ParticleData<Space>
{
float someGenericStuff;
};
void DumpParticles();
ParticleSystem()
{
particles.push_back(Particle());
}
std::vector<Particle> particles;
};
template<>
struct Dumper<ParticleSystem<Space2,char> >
{
static void Do(ParticleSystem<Space2,char>::Particle& p)
{
printf("2: %f %f\n", p.orientation, p.invInertia );
}
};
template<>
struct Dumper<ParticleSystem<Space3,float> >
{
static void Do(ParticleSystem<Space3,float>::Particle& p)
{
printf("3: %f\n", p.test );
}
};
template<typename Space,typename AwesomeParam>
void ParticleSystem<Space,AwesomeParam>::DumpParticles()
{
for(size_t particleIndex = 0; particleIndex < particles.size(); particleIndex++)
{
Dumper<ParticleSystem<Space,AwesomeParam> >::Do(particles[particleIndex]);
}
}
int main()
{
ParticleSystem<Space3,float> p3;
ParticleSystem<Space2,char> p2;
p3.DumpParticles();
p2.DumpParticles();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx2ZWN0b3I+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnN0cnVjdCBTcGFjZTIKewogICAgc3RydWN0IFZlY3RvcgogICAgewoKICAgIH07Cgp9OwpzdHJ1Y3QgU3BhY2UzCnsKICAgIHN0cnVjdCBWZWN0b3IKICAgIHsKCiAgICB9OwoKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFNwYWNlPgpzdHJ1Y3QgUGFydGljbGVEYXRhe307Cgp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgUGFydGljbGVEYXRhPFNwYWNlMj4KewogIGZsb2F0IG9yaWVudGF0aW9uOwogIGZsb2F0IGludkluZXJ0aWE7CiAgUGFydGljbGVEYXRhKCkKICB7CiAgICBvcmllbnRhdGlvbiA9IDIuMGYgOwogICAgaW52SW5lcnRpYSA9IDMuMGY7CiAgfQp9OwoKdGVtcGxhdGUgPD4Kc3RydWN0IFBhcnRpY2xlRGF0YTxTcGFjZTM+CnsKICAgIGZsb2F0IHRlc3Q7CiAgICBQYXJ0aWNsZURhdGEoKQogICAgewogICAgICAgIHRlc3QgPSAxMDA1MDAuMGY7CiAgICB9Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3QgRHVtcGVyCnsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgT3ZlcmxvYWR7fTsKCnRlbXBsYXRlPHR5cGVuYW1lIFNwYWNlLHR5cGVuYW1lIEF3ZXNvbWVQYXJhbT4Kc3RydWN0IFBhcnRpY2xlU3lzdGVtCnsKICBzdHJ1Y3QgUGFydGljbGUgOiBwdWJsaWMgUGFydGljbGVEYXRhPFNwYWNlPgogIHsKICAgIGZsb2F0IHNvbWVHZW5lcmljU3R1ZmY7CiAgfTsKCiAgdm9pZCBEdW1wUGFydGljbGVzKCk7CiAgCiAgUGFydGljbGVTeXN0ZW0oKQogIHsKICAgIHBhcnRpY2xlcy5wdXNoX2JhY2soUGFydGljbGUoKSk7CiAgfQogIHN0ZDo6dmVjdG9yPFBhcnRpY2xlPiBwYXJ0aWNsZXM7Cn07Cgp0ZW1wbGF0ZTw+CnN0cnVjdCBEdW1wZXI8UGFydGljbGVTeXN0ZW08U3BhY2UyLGNoYXI+ID4KewogIHN0YXRpYyB2b2lkIERvKFBhcnRpY2xlU3lzdGVtPFNwYWNlMixjaGFyPjo6UGFydGljbGUmIHApCiAgewogICAgcHJpbnRmKCIyOiAlZiAlZlxuIiwgcC5vcmllbnRhdGlvbiwgcC5pbnZJbmVydGlhICk7CiAgfQp9OwoKdGVtcGxhdGU8PgpzdHJ1Y3QgRHVtcGVyPFBhcnRpY2xlU3lzdGVtPFNwYWNlMyxmbG9hdD4gPgp7CiAgc3RhdGljIHZvaWQgRG8oUGFydGljbGVTeXN0ZW08U3BhY2UzLGZsb2F0Pjo6UGFydGljbGUmIHApCiAgewogICAgcHJpbnRmKCIzOiAlZlxuIiwgcC50ZXN0ICk7CiAgfQp9OwoKdGVtcGxhdGU8dHlwZW5hbWUgU3BhY2UsdHlwZW5hbWUgQXdlc29tZVBhcmFtPgp2b2lkIFBhcnRpY2xlU3lzdGVtPFNwYWNlLEF3ZXNvbWVQYXJhbT46OkR1bXBQYXJ0aWNsZXMoKQp7CiAgZm9yKHNpemVfdCBwYXJ0aWNsZUluZGV4ID0gMDsgcGFydGljbGVJbmRleCA8IHBhcnRpY2xlcy5zaXplKCk7IHBhcnRpY2xlSW5kZXgrKykKICB7CiAgICBEdW1wZXI8UGFydGljbGVTeXN0ZW08U3BhY2UsQXdlc29tZVBhcmFtPiA+OjpEbyhwYXJ0aWNsZXNbcGFydGljbGVJbmRleF0pOwogIH0KfQoKCmludCBtYWluKCkKewogICAgUGFydGljbGVTeXN0ZW08U3BhY2UzLGZsb2F0PiBwMzsKICAgIFBhcnRpY2xlU3lzdGVtPFNwYWNlMixjaGFyPiBwMjsKICAgIHAzLkR1bXBQYXJ0aWNsZXMoKTsKICAgIHAyLkR1bXBQYXJ0aWNsZXMoKTsKICAgIHJldHVybiAwOwp9Cg==