#include <memory>
#include <type_traits>
// Fluent syntax helper to binds service implementations and factory methods
template<typename TService> struct BindSyntax {
// Placeholder for real service factory function pointer registration.
typedef std::shared_ptr<TService>(*CreateServiceFunction)(int);
CreateServiceFunction myFunction;
// Define a factory method to provide the service
// TODO: Can the compiler implicitly figure out the function's return type?
template<typename TResult, std::shared_ptr<TResult>(*TMethod)(int)>
void ToFactoryMethod() {
static_assert(
std::is_base_of<TService, TResult>::value, "Result must inherit service"
);
myFunction = [](int mooh) {
return std::static_pointer_cast<TService>(TMethod(mooh));
};
}
};
// ------------------------------------------------------------------------- //
struct Base {};
struct Derived : public Base {};
// Example factory method
std::shared_ptr<Derived> exampleFactory(int) {
return std::make_shared<Derived>();
}
int main() {
BindSyntax<Base> bind;
bind.ToFactoryMethod<Derived, exampleFactory>();
// In the above call, I don't want to have to explicitly specify
// 'Derived' as the return type of the method
}
I2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKLy8gRmx1ZW50IHN5bnRheCBoZWxwZXIgdG8gYmluZHMgc2VydmljZSBpbXBsZW1lbnRhdGlvbnMgYW5kIGZhY3RvcnkgbWV0aG9kcwp0ZW1wbGF0ZTx0eXBlbmFtZSBUU2VydmljZT4gc3RydWN0IEJpbmRTeW50YXggewoKICAvLyBQbGFjZWhvbGRlciBmb3IgcmVhbCBzZXJ2aWNlIGZhY3RvcnkgZnVuY3Rpb24gcG9pbnRlciByZWdpc3RyYXRpb24uCiAgdHlwZWRlZiBzdGQ6OnNoYXJlZF9wdHI8VFNlcnZpY2U+KCpDcmVhdGVTZXJ2aWNlRnVuY3Rpb24pKGludCk7CiAgQ3JlYXRlU2VydmljZUZ1bmN0aW9uIG15RnVuY3Rpb247CgogIC8vIERlZmluZSBhIGZhY3RvcnkgbWV0aG9kIHRvIHByb3ZpZGUgdGhlIHNlcnZpY2UKICAvLyBUT0RPOiBDYW4gdGhlIGNvbXBpbGVyIGltcGxpY2l0bHkgZmlndXJlIG91dCB0aGUgZnVuY3Rpb24ncyByZXR1cm4gdHlwZT8KICB0ZW1wbGF0ZTx0eXBlbmFtZSBUUmVzdWx0LCBzdGQ6OnNoYXJlZF9wdHI8VFJlc3VsdD4oKlRNZXRob2QpKGludCk+CiAgdm9pZCBUb0ZhY3RvcnlNZXRob2QoKSB7CiAgICBzdGF0aWNfYXNzZXJ0KAogICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8VFNlcnZpY2UsIFRSZXN1bHQ+Ojp2YWx1ZSwgIlJlc3VsdCBtdXN0IGluaGVyaXQgc2VydmljZSIKICAgICk7CgogICAgbXlGdW5jdGlvbiA9IFtdKGludCBtb29oKSB7CiAgICAgIHJldHVybiBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8VFNlcnZpY2U+KFRNZXRob2QobW9vaCkpOwogICAgfTsKICB9Cn07CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vCgpzdHJ1Y3QgQmFzZSB7fTsKc3RydWN0IERlcml2ZWQgOiBwdWJsaWMgQmFzZSB7fTsKCi8vIEV4YW1wbGUgZmFjdG9yeSBtZXRob2QKc3RkOjpzaGFyZWRfcHRyPERlcml2ZWQ+IGV4YW1wbGVGYWN0b3J5KGludCkgewogIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPERlcml2ZWQ+KCk7Cn0KCmludCBtYWluKCkgewogIEJpbmRTeW50YXg8QmFzZT4gYmluZDsKICBiaW5kLlRvRmFjdG9yeU1ldGhvZDxEZXJpdmVkLCBleGFtcGxlRmFjdG9yeT4oKTsKICAKICAvLyBJbiB0aGUgYWJvdmUgY2FsbCwgSSBkb24ndCB3YW50IHRvIGhhdmUgdG8gZXhwbGljaXRseSBzcGVjaWZ5CiAgLy8gJ0Rlcml2ZWQnIGFzIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbWV0aG9kCn0=