#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<class T, class Enable = void>
struct ParticleData;
template<class T>
struct ParticleData<T, typename std::enable_if < std::is_same<T, Space2>::value>::type>
{
float orientation;
float invInertia;
ParticleData()
{
orientation = 2.0f ;
invInertia = 3.0f;
}
};
template<class T>
struct ParticleData<T, typename std::enable_if < std::is_same<T, Space3>::value>::type>
{
float test;
ParticleData()
{
test = 100500.0f;
}
};
//typedef typename std::conditional<std::is_same<Space, Space2>::value, ParticleData2, ParticleData3>::type ParticleData;
struct Particle : public ParticleData<Space>
{
float someGenericStuff;
};
template<class T>
void DumpParticle(size_t particleIndex, typename std::enable_if < std::is_same<T, Space2>::value &&std::is_same<Space, Space2>::value >::type* val = 0)
{
printf("2: %f %f\n", particles[particleIndex].orientation, particles[particleIndex].invInertia );
}
template<class T>
void DumpParticle(size_t particleIndex, typename std::enable_if < std::is_same<T, Space3>::value &&std::is_same<Space, Space3>::value >::type* 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+CnN0cnVjdCBQYXJ0aWNsZVN5c3RlbQp7CiAgICB0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBFbmFibGUgPSB2b2lkPgogICAgc3RydWN0IFBhcnRpY2xlRGF0YTsKCiAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgc3RydWN0IFBhcnRpY2xlRGF0YTxULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZiA8IHN0ZDo6aXNfc2FtZTxULCBTcGFjZTI+Ojp2YWx1ZT46OnR5cGU+CiAgICB7CiAgICAgICAgZmxvYXQgb3JpZW50YXRpb247CiAgICAgICAgZmxvYXQgaW52SW5lcnRpYTsKICAgICAgICBQYXJ0aWNsZURhdGEoKQogICAgICAgIHsKICAgICAgICAgICAgb3JpZW50YXRpb24gPSAyLjBmIDsKICAgICAgICAgICAgaW52SW5lcnRpYSA9IDMuMGY7CiAgICAgICAgfQogICAgfTsKCiAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgc3RydWN0IFBhcnRpY2xlRGF0YTxULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZiA8IHN0ZDo6aXNfc2FtZTxULCBTcGFjZTM+Ojp2YWx1ZT46OnR5cGU+CiAgICB7CiAgICAgICAgZmxvYXQgdGVzdDsKICAgICAgICBQYXJ0aWNsZURhdGEoKQogICAgICAgIHsKICAgICAgICAgICAgdGVzdCA9IDEwMDUwMC4wZjsKICAgICAgICB9CiAgICB9OwoKICAgIC8vdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPHN0ZDo6aXNfc2FtZTxTcGFjZSwgU3BhY2UyPjo6dmFsdWUsIFBhcnRpY2xlRGF0YTIsIFBhcnRpY2xlRGF0YTM+Ojp0eXBlIFBhcnRpY2xlRGF0YTsKCiAgICBzdHJ1Y3QgUGFydGljbGUgOiBwdWJsaWMgUGFydGljbGVEYXRhPFNwYWNlPgogICAgewogICAgICAgIGZsb2F0IHNvbWVHZW5lcmljU3R1ZmY7CiAgICB9OwoKCiAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgdm9pZCBEdW1wUGFydGljbGUoc2l6ZV90IHBhcnRpY2xlSW5kZXgsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmIDwgc3RkOjppc19zYW1lPFQsIFNwYWNlMj46OnZhbHVlICYmc3RkOjppc19zYW1lPFNwYWNlLCBTcGFjZTI+Ojp2YWx1ZSA+Ojp0eXBlKiB2YWwgPSAwKQogICAgewogICAgICAgIHByaW50ZigiMjogJWYgJWZcbiIsIHBhcnRpY2xlc1twYXJ0aWNsZUluZGV4XS5vcmllbnRhdGlvbiwgcGFydGljbGVzW3BhcnRpY2xlSW5kZXhdLmludkluZXJ0aWEgKTsKICAgIH0KCiAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgdm9pZCBEdW1wUGFydGljbGUoc2l6ZV90IHBhcnRpY2xlSW5kZXgsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmIDwgc3RkOjppc19zYW1lPFQsIFNwYWNlMz46OnZhbHVlICYmc3RkOjppc19zYW1lPFNwYWNlLCBTcGFjZTM+Ojp2YWx1ZSA+Ojp0eXBlKiB2YWwgPSAwKQogICAgewogICAgICAgIHByaW50ZigiMzogJWZcbiIsIHBhcnRpY2xlc1twYXJ0aWNsZUluZGV4XS50ZXN0KTsKICAgIH0KCiAgICB2b2lkIER1bXBQYXJ0aWNsZShzaXplX3QgcGFydGljbGVJbmRleCkKICAgIHsKICAgICAgICBEdW1wUGFydGljbGU8U3BhY2U+KCBwYXJ0aWNsZUluZGV4KTsKICAgIH0KCiAgICB2b2lkIER1bXBQYXJ0aWNsZXMoKQogICAgewogICAgICAgIGZvciAoc2l6ZV90IHBhcnRpY2xlSW5kZXggPSAwOyBwYXJ0aWNsZUluZGV4IDwgcGFydGljbGVzLnNpemUoKTsgcGFydGljbGVJbmRleCsrKQogICAgICAgIHsKICAgICAgICAgICAgRHVtcFBhcnRpY2xlKHBhcnRpY2xlSW5kZXgpOwogICAgICAgIH0KICAgIH0KICAgIFBhcnRpY2xlU3lzdGVtKCkKICAgIHsKICAgICAgICBwYXJ0aWNsZXMucHVzaF9iYWNrKFBhcnRpY2xlKCkpOwogICAgfQogICAgc3RkOjp2ZWN0b3I8UGFydGljbGU+IHBhcnRpY2xlczsKfTsKCgoKaW50IG1haW4oKQp7CiAgICBQYXJ0aWNsZVN5c3RlbTxTcGFjZTMsIGZsb2F0PiBwMzsKICAgIFBhcnRpY2xlU3lzdGVtPFNwYWNlMiwgY2hhcj4gcDI7CiAgICBwMy5EdW1wUGFydGljbGVzKCk7CiAgICBwMi5EdW1wUGFydGljbGVzKCk7CiAgICByZXR1cm4gMDsKfQ==