#include <stdio.h>
#include <vector>
#include <type_traits>
using namespace std;
struct Space2
{
struct Vector
{
};
};
struct Space3
{
struct Vector
{
};
};
template<typename Space, typename AwesomeParam>
struct ParticleSystem
{
template< typename T>
using isSpace2 = typename std::enable_if < std::is_same<T, Space2>::value && std::is_same<Space, Space2>::value >::type;
template< typename T>
using isSpace3 = typename std::enable_if < std::is_same<T, Space3>::value && std::is_same<Space, Space3>::value >::type;
template<class T, class Enable = void>
struct ParticleData;
template<class T>
struct ParticleData<T, isSpace2<T>>
{
float orientation;
float invInertia;
ParticleData()
{
orientation = 2.0f ;
invInertia = 3.0f;
}
};
template<class T>
struct ParticleData<T, isSpace3<T>>
{
float test;
ParticleData()
{
test = 100500.0f;
}
};
struct Particle : public ParticleData<Space>
{
float someGenericStuff;
};
template<class T>
void DumpParticle(size_t particleIndex, isSpace2<T>* val = 0)
{
printf("2: %f %f\n", particles[particleIndex].orientation, particles[particleIndex].invInertia );
}
template<class T>
void DumpParticle(size_t particleIndex, isSpace3<T>* val = 0)
{
printf("3: %f\n", particles[particleIndex].test);
}
void DumpParticle(size_t particleIndex)
{
DumpParticle<Space>( particleIndex);
}
void DumpParticles()
{
for (size_t particleIndex = 0; particleIndex < particles.size(); particleIndex++)
{
DumpParticle(particleIndex);
}
}
ParticleSystem()
{
particles.push_back(Particle());
}
std::vector<Particle> particles;
};
int main()
{
ParticleSystem<Space3, float> p3;
ParticleSystem<Space2, char> p2;
p3.DumpParticles();
p2.DumpParticles();
return 0;
}
CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnN0cnVjdCBTcGFjZTIKewogICAgc3RydWN0IFZlY3RvcgogICAgewoKICAgIH07Cgp9OwpzdHJ1Y3QgU3BhY2UzCnsKICAgIHN0cnVjdCBWZWN0b3IKICAgIHsKCiAgICB9OwoKfTsKCgoKCnRlbXBsYXRlPHR5cGVuYW1lIFNwYWNlLCB0eXBlbmFtZSBBd2Vzb21lUGFyYW0+CnN0cnVjdCBQYXJ0aWNsZVN5c3RlbQp7CiAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgVD4KICAgIHVzaW5nIGlzU3BhY2UyID0gIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmIDwgc3RkOjppc19zYW1lPFQsIFNwYWNlMj46OnZhbHVlICYmIHN0ZDo6aXNfc2FtZTxTcGFjZSwgU3BhY2UyPjo6dmFsdWUgPjo6dHlwZTsKCiAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgVD4KICAgIHVzaW5nIGlzU3BhY2UzID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWYgPCBzdGQ6OmlzX3NhbWU8VCwgU3BhY2UzPjo6dmFsdWUgJiYgc3RkOjppc19zYW1lPFNwYWNlLCBTcGFjZTM+Ojp2YWx1ZSA+Ojp0eXBlOwoKICAgIHRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIEVuYWJsZSA9IHZvaWQ+CiAgICBzdHJ1Y3QgUGFydGljbGVEYXRhOwoKICAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICBzdHJ1Y3QgUGFydGljbGVEYXRhPFQsIGlzU3BhY2UyPFQ+PgogICAgewogICAgICAgIGZsb2F0IG9yaWVudGF0aW9uOwogICAgICAgIGZsb2F0IGludkluZXJ0aWE7CiAgICAgICAgUGFydGljbGVEYXRhKCkKICAgICAgICB7CiAgICAgICAgICAgIG9yaWVudGF0aW9uID0gMi4wZiA7CiAgICAgICAgICAgIGludkluZXJ0aWEgPSAzLjBmOwogICAgICAgIH0KICAgIH07CgogICAgdGVtcGxhdGU8Y2xhc3MgVD4KICAgIHN0cnVjdCBQYXJ0aWNsZURhdGE8VCwgaXNTcGFjZTM8VD4+CiAgICB7CiAgICAgICAgZmxvYXQgdGVzdDsKICAgICAgICBQYXJ0aWNsZURhdGEoKQogICAgICAgIHsKICAgICAgICAgICAgdGVzdCA9IDEwMDUwMC4wZjsKICAgICAgICB9CiAgICB9OwoKICAgIHN0cnVjdCBQYXJ0aWNsZSA6IHB1YmxpYyBQYXJ0aWNsZURhdGE8U3BhY2U+CiAgICB7CiAgICAgICAgZmxvYXQgc29tZUdlbmVyaWNTdHVmZjsKICAgIH07CgoKICAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICB2b2lkIER1bXBQYXJ0aWNsZShzaXplX3QgcGFydGljbGVJbmRleCwgIGlzU3BhY2UyPFQ+KiB2YWwgPSAwKQogICAgewogICAgICAgIHByaW50ZigiMjogJWYgJWZcbiIsIHBhcnRpY2xlc1twYXJ0aWNsZUluZGV4XS5vcmllbnRhdGlvbiwgcGFydGljbGVzW3BhcnRpY2xlSW5kZXhdLmludkluZXJ0aWEgKTsKICAgIH0KCiAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgdm9pZCBEdW1wUGFydGljbGUoc2l6ZV90IHBhcnRpY2xlSW5kZXgsIGlzU3BhY2UzPFQ+KiB2YWwgPSAwKQogICAgewogICAgICAgIHByaW50ZigiMzogJWZcbiIsIHBhcnRpY2xlc1twYXJ0aWNsZUluZGV4XS50ZXN0KTsKICAgIH0KCiAgICB2b2lkIER1bXBQYXJ0aWNsZShzaXplX3QgcGFydGljbGVJbmRleCkKICAgIHsKICAgICAgICBEdW1wUGFydGljbGU8U3BhY2U+KCBwYXJ0aWNsZUluZGV4KTsKICAgIH0KCiAgICB2b2lkIER1bXBQYXJ0aWNsZXMoKQogICAgewogICAgICAgIGZvciAoc2l6ZV90IHBhcnRpY2xlSW5kZXggPSAwOyBwYXJ0aWNsZUluZGV4IDwgcGFydGljbGVzLnNpemUoKTsgcGFydGljbGVJbmRleCsrKQogICAgICAgIHsKICAgICAgICAgICAgRHVtcFBhcnRpY2xlKHBhcnRpY2xlSW5kZXgpOwogICAgICAgIH0KICAgIH0KICAgIFBhcnRpY2xlU3lzdGVtKCkKICAgIHsKICAgICAgICBwYXJ0aWNsZXMucHVzaF9iYWNrKFBhcnRpY2xlKCkpOwogICAgfQogICAgc3RkOjp2ZWN0b3I8UGFydGljbGU+IHBhcnRpY2xlczsKfTsKCgoKaW50IG1haW4oKQp7CiAgICBQYXJ0aWNsZVN5c3RlbTxTcGFjZTMsIGZsb2F0PiBwMzsKICAgIFBhcnRpY2xlU3lzdGVtPFNwYWNlMiwgY2hhcj4gcDI7CiAgICBwMy5EdW1wUGFydGljbGVzKCk7CiAgICBwMi5EdW1wUGFydGljbGVzKCk7CiAgICByZXR1cm4gMDsKfQ==