#include <iostream>
#include <memory>
#include <utility>
#include <stdint.h>
using namespace std;
template<typename T, typename... Args>
std::shared_ptr<T> factory(Args&&... args) {
std::cout << "Got type " << typeid(T).name() << std::endl;
return std::shared_ptr<T>(new T(std::forward<Args>(args)...));
}
class Foo {
public:
Foo(uint8_t a, uint8_t b) {
std::cout << "wat" << std::endl;
}
Foo(float a, float b) {
std::cout << "Expected behavior" << std::endl;
}
};
int main() {
float a = 4.1f;
float b = 8.2f;
auto foo = factory<Foo>(a, b);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPHN0ZGludC5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4Kc3RkOjpzaGFyZWRfcHRyPFQ+IGZhY3RvcnkoQXJncyYmLi4uIGFyZ3MpIHsKCXN0ZDo6Y291dCA8PCAiR290IHR5cGUgIiA8PCB0eXBlaWQoVCkubmFtZSgpIDw8IHN0ZDo6ZW5kbDsKCXJldHVybiBzdGQ6OnNoYXJlZF9wdHI8VD4obmV3IFQoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKSk7Cn0KCmNsYXNzIEZvbyB7CnB1YmxpYzoKCUZvbyh1aW50OF90IGEsIHVpbnQ4X3QgYikgewoJCXN0ZDo6Y291dCA8PCAid2F0IiA8PCBzdGQ6OmVuZGw7Cgl9CglGb28oZmxvYXQgYSwgZmxvYXQgYikgewoJCXN0ZDo6Y291dCA8PCAiRXhwZWN0ZWQgYmVoYXZpb3IiIDw8IHN0ZDo6ZW5kbDsKCX0KfTsKaW50IG1haW4oKSB7CglmbG9hdCBhID0gNC4xZjsKCWZsb2F0IGIgPSA4LjJmOwoJYXV0byBmb28gPSBmYWN0b3J5PEZvbz4oYSwgYik7CglyZXR1cm4gMDsKfQ==