#include <string>
#include <typeindex>
#include <iostream>
struct DummyProduction {
} ;
struct Dep {
} ;
struct Pro {
} ;
class ModuleBase {
} ;
template < typename Production = DummyProduction>
class Provider {
public :
template < typename ... Dependencies >
Provider( ModuleBase& module, Dependencies... args )
{
std:: cout << "Provider called!" << std:: endl ;
}
Provider( const Provider& ) = delete ;
} ;
class TargetController : public ModuleBase,
public Provider< Pro> ,
public Provider<>
{
public :
TargetController( ) ;
private :
Dep p;
} ;
TargetController:: TargetController ( ) :
ModuleBase( ) ,
Provider< Pro> ( * this , & p) ,
Provider<> ( * this ) ,
p( )
{
}
int main( )
{
TargetController x;
return 0 ;
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHR5cGVpbmRleD4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IER1bW15UHJvZHVjdGlvbiB7Cn07CgpzdHJ1Y3QgRGVwIHsKfTsKCnN0cnVjdCBQcm8gewp9OwoKY2xhc3MgTW9kdWxlQmFzZSB7Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBQcm9kdWN0aW9uID0gRHVtbXlQcm9kdWN0aW9uPgpjbGFzcyBQcm92aWRlciB7CnB1YmxpYzoKICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBEZXBlbmRlbmNpZXM+CiAgUHJvdmlkZXIoTW9kdWxlQmFzZSYgbW9kdWxlLCBEZXBlbmRlbmNpZXMuLi4gYXJncykKICB7CiAgICBzdGQ6OmNvdXQgPDwgIlByb3ZpZGVyIGNhbGxlZCEiIDw8IHN0ZDo6ZW5kbDsKICB9CiAgUHJvdmlkZXIoY29uc3QgUHJvdmlkZXImKSA9IGRlbGV0ZTsKfTsKCmNsYXNzIFRhcmdldENvbnRyb2xsZXIgOiBwdWJsaWMgTW9kdWxlQmFzZSwKICBwdWJsaWMgUHJvdmlkZXI8UHJvPiwKICBwdWJsaWMgUHJvdmlkZXI8Pgp7CnB1YmxpYzoKICBUYXJnZXRDb250cm9sbGVyKCk7CnByaXZhdGU6CiAgRGVwIHA7Cn07CgpUYXJnZXRDb250cm9sbGVyOjpUYXJnZXRDb250cm9sbGVyKCkgOgogIE1vZHVsZUJhc2UoKSwKICBQcm92aWRlcjxQcm8+KCp0aGlzLCAmcCksCiAgUHJvdmlkZXI8PigqdGhpcyksCiAgcCgpCnsKfQoKaW50IG1haW4oKQp7CiAgVGFyZ2V0Q29udHJvbGxlciB4OwogIHJldHVybiAwOwp9