fork download
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. using namespace std;
  5.  
  6. class sai
  7. {
  8. public:
  9. virtual void unknown03()=0;
  10. };
  11.  
  12. class saiA:public sai
  13. {
  14. public:
  15. virtual void unknown03() { cout<<"A.unknown03()"<<endl; }
  16. };
  17.  
  18. class saiB:public sai
  19. {
  20. public:
  21. virtual void unknown03() { cout<<"B.unknown03()"<<endl; }
  22. };
  23.  
  24. sai *find_interface(const char *dll,const char *name)
  25. {
  26. cout<<dll<<' '<<name<<endl;
  27. if(dll==string("abc")) return new saiA();
  28. else if(dll==string("ghi")) return new saiB();
  29. return nullptr;
  30. }
  31.  
  32. class InterfaceBase
  33. {
  34. public:
  35. virtual sai *get()=0;
  36. sai *operator->() { return get(); }
  37. };
  38.  
  39. template<const char *dll,const char *name> class Interface: public InterfaceBase
  40. {
  41. public:
  42. virtual sai *get()
  43. {
  44. static sai *intf=find_interface(dll,name);
  45. return intf;
  46. }
  47. };
  48.  
  49. constexpr char abc[]="abc";
  50. constexpr char def[]="def";
  51. constexpr char ghi[]="ghi";
  52. constexpr char jkl[]="jkl";
  53.  
  54. int main()
  55. {
  56. vector<InterfaceBase*> IntList;
  57. IntList.push_back(new Interface<abc,def>());
  58. IntList.push_back(new Interface<ghi,jkl>());
  59. for(auto intf:IntList) (*intf)->unknown03();
  60. for(auto intf:IntList) (*intf)->unknown03();
  61. for(auto intf:IntList) (*intf)->unknown03();
  62. return 0;
  63. }
  64.  
Success #stdin #stdout 0s 4700KB
stdin
Standard input is empty
stdout
abc def
A.unknown03()
ghi jkl
B.unknown03()
A.unknown03()
B.unknown03()
A.unknown03()
B.unknown03()