#include <vector>
#include <string>
#include <functional>
#include <iostream>
using namespace std;
struct Object {
template < typename T>
Object( T t) : model( new Model< T> ( t) ) {
cout << "construct object from T" << endl;
}
friend void print( string str) {
cout << str << endl;
}
friend void print( int i) {
cout << i << endl;
}
struct Concept {
virtual void print( ) = 0 ;
} ;
template < typename T>
struct Model : Concept {
Model( T t) : data( t) { }
void print( ) {
print( data) ;
}
T data;
} ;
Concept * model;
} ;
struct For {
For( ) {
cout << "default construct For" << endl;
}
For( Object o) {
cout << "construct For from object and push back" << endl;
objects.push_back ( o) ;
}
For operator( ) ( Object o) {
cout << "push back object" << endl;
objects.push_back ( o) ;
return * this ;
}
void print( ) {
for ( auto o : objects) {
o.model - > print( ) ;
}
} ;
vector< Object> objects;
} ;
int main( ) {
auto heterogeneous = For( 1 ) ( string( "hello" ) ) ;
function< void ( int ) > f = [ ] ( int i) - > void { cout << i << endl; } ;
heterogeneous.print ( ) ;
}
ICAgICNpbmNsdWRlIDx2ZWN0b3I+CiAgICAjaW5jbHVkZSA8c3RyaW5nPgogICAgI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiAgICAjaW5jbHVkZSA8aW9zdHJlYW0+CgogICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiAgICBzdHJ1Y3QgT2JqZWN0IHsKICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgICAgICBPYmplY3QoVCB0KSA6IG1vZGVsKG5ldyBNb2RlbDxUPih0KSkgewogICAgICAgICAgICBjb3V0IDw8ICJjb25zdHJ1Y3Qgb2JqZWN0IGZyb20gVCIgPDwgZW5kbDsKICAgICAgICB9CiAgICAgICAgZnJpZW5kIHZvaWQgcHJpbnQoc3RyaW5nIHN0cikgewogICAgICAgICAgICBjb3V0IDw8IHN0ciA8PCBlbmRsOwogICAgICAgIH0KICAgICAgICBmcmllbmQgdm9pZCBwcmludChpbnQgaSkgewogICAgICAgICAgICBjb3V0IDw8IGkgPDwgZW5kbDsKICAgICAgICB9CiAgICAgICAgc3RydWN0IENvbmNlcHQgewogICAgICAgICAgICB2aXJ0dWFsIHZvaWQgcHJpbnQoKSA9MDsKICAgICAgICB9OwogICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgICAgIHN0cnVjdCBNb2RlbCA6IENvbmNlcHQgewogICAgICAgICAgICBNb2RlbChUIHQpIDogZGF0YSh0KSB7fQogICAgICAgICAgICB2b2lkIHByaW50KCkgewogICAgICAgICAgICAgICAgcHJpbnQoZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgVCBkYXRhOwogICAgICAgIH07CiAgICAgICAgQ29uY2VwdCAqbW9kZWw7CiAgICB9OwoKICAgIHN0cnVjdCBGb3IgewogICAgICAgIEZvcigpIHsKICAgICAgICAgICAgY291dCA8PCAiZGVmYXVsdCBjb25zdHJ1Y3QgRm9yIiA8PCBlbmRsOwogICAgICAgIH0KICAgICAgICBGb3IoT2JqZWN0IG8pIHsKICAgICAgICAgICAgY291dCA8PCAiY29uc3RydWN0IEZvciBmcm9tIG9iamVjdCBhbmQgcHVzaCBiYWNrIiA8PCBlbmRsOwogICAgICAgICAgICBvYmplY3RzLnB1c2hfYmFjayhvKTsKICAgICAgICB9CiAgICAgICAgRm9yIG9wZXJhdG9yKCkoT2JqZWN0IG8pIHsKICAgICAgICAgICAgY291dCA8PCAicHVzaCBiYWNrIG9iamVjdCIgPDwgZW5kbDsKICAgICAgICAgICAgb2JqZWN0cy5wdXNoX2JhY2sobyk7CiAgICAgICAgICAgIHJldHVybiAqdGhpczsKICAgICAgICB9CiAgICAgICAgdm9pZCBwcmludCgpIHsKICAgICAgICAgICAgZm9yKGF1dG8gbyA6IG9iamVjdHMpIHsKICAgICAgICAgICAgICAgIG8ubW9kZWwtPnByaW50KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHZlY3RvcjxPYmplY3Q+IG9iamVjdHM7CiAgICB9OwoKICAgIGludCBtYWluKCkgewogICAgICAgIGF1dG8gaGV0ZXJvZ2VuZW91cyA9IEZvcigxKShzdHJpbmcoImhlbGxvIikpOwogICAgICAgIGZ1bmN0aW9uPHZvaWQoaW50KT4gZiA9IFtdKGludCBpKS0+dm9pZHsgY291dCA8PCBpIDw8IGVuZGw7IH07CiAgICAgICAgaGV0ZXJvZ2VuZW91cy5wcmludCgpOwogICAgfQo=
compilation info
prog.cpp: In instantiation of ‘void Object::Model<T>::print() [with T = std::__cxx11::basic_string<char>]’:
prog.cpp:58:5: required from here
prog.cpp:26:22: error: no matching function for call to ‘Object::Model<std::__cxx11::basic_string<char> >::print(std::__cxx11::basic_string<char>&)’
print(data);
~~~~~^~~~~~
prog.cpp:25:18: note: candidate: void Object::Model<T>::print() [with T = std::__cxx11::basic_string<char>]
void print() {
^~~~~
prog.cpp:25:18: note: candidate expects 0 arguments, 1 provided
prog.cpp: In instantiation of ‘void Object::Model<T>::print() [with T = int]’:
prog.cpp:58:5: required from here
prog.cpp:26:22: error: no matching function for call to ‘Object::Model<int>::print(int&)’
print(data);
~~~~~^~~~~~
prog.cpp:25:18: note: candidate: void Object::Model<T>::print() [with T = int]
void print() {
^~~~~
prog.cpp:25:18: note: candidate expects 0 arguments, 1 provided
stdout