#include <iostream>
#include <vector>
#include <type_traits>
#include <memory>
class Light{};
class PointLight: public Light{};
class DirectionalLight: public Light{};
std::vector< std::unique_ptr<Light> > lights;
template<typename T>
void CreateLight()
{
static_assert(std::is_base_of<Light, T>::value, "Type must of descendant of type Light. ");
// store to vector directly
lights.emplace_back( std::make_unique<T>(/*args*/));
}
int main()
{
CreateLight<PointLight>();
//Either directly
auto iter = lights.rbegin();
if(*iter) std::cout << "Done\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDxtZW1vcnk+CgpjbGFzcyBMaWdodHt9OwpjbGFzcyBQb2ludExpZ2h0OiBwdWJsaWMgTGlnaHR7fTsKY2xhc3MgRGlyZWN0aW9uYWxMaWdodDogcHVibGljIExpZ2h0e307CgpzdGQ6OnZlY3Rvcjwgc3RkOjp1bmlxdWVfcHRyPExpZ2h0PiA+IGxpZ2h0czsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnZvaWQgQ3JlYXRlTGlnaHQoKQp7CiAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19iYXNlX29mPExpZ2h0LCBUPjo6dmFsdWUsICJUeXBlIG11c3Qgb2YgZGVzY2VuZGFudCBvZiB0eXBlIExpZ2h0LiAiKTsKICAgLy8gc3RvcmUgdG8gdmVjdG9yIGRpcmVjdGx5CiAgIGxpZ2h0cy5lbXBsYWNlX2JhY2soIHN0ZDo6bWFrZV91bmlxdWU8VD4oLyphcmdzKi8pKTsKfQoKaW50IG1haW4oKQp7CiAgIENyZWF0ZUxpZ2h0PFBvaW50TGlnaHQ+KCk7CgogICAvL0VpdGhlciBkaXJlY3RseQogICBhdXRvIGl0ZXIgPSBsaWdodHMucmJlZ2luKCk7CiAgIGlmKCppdGVyKSBzdGQ6OmNvdXQgPDwgIkRvbmVcbiI7CgoKICAgcmV0dXJuIDA7Cn0=