#include <iostream>
using namespace std;
struct some_class
{
char field1;
bool field2;
some_class()
: field1('a')
, field2(0)
{
}
};
struct unnamed_lambda
{
template<typename T>
T operator()(T x) const { return x + 1; }
};
struct unnamed_lambda2
{
template<typename T>
T operator()(T x) const { return x + 2; }
};
template<class processor>
void reflect(processor & p, some_class& sc)
{
reflect(p, sc.field1, "field1");
reflect(p, sc.field2, "field2");
}
template<class t>
void reflect(unnamed_lambda & p, t& val, string str)
{
cout << val << endl;
}
void print_helper()
{
unnamed_lambda lambda = unnamed_lambda{};
some_class sc;
reflect(lambda, sc);
}
template<class t>
void reflect2(unnamed_lambda2 & p, t& val, string str)
{
cout << val + 1 << endl;
}
void print_helper2()
{
unnamed_lambda2 lambda = unnamed_lambda2{};
some_class sc;
reflect(lambda, sc);
}
int main()
{
print_helper();
print_helper2();
system("pause");
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnN0cnVjdCBzb21lX2NsYXNzCnsKICAgIGNoYXIgZmllbGQxOwogICAgYm9vbCBmaWVsZDI7CgogICAgc29tZV9jbGFzcygpCiAgICAgICAgOiBmaWVsZDEoJ2EnKQogICAgICAgICwgZmllbGQyKDApCiAgICB7CiAgICB9Cn07CgpzdHJ1Y3QgdW5uYW1lZF9sYW1iZGEKewogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIFQgb3BlcmF0b3IoKShUIHgpIGNvbnN0IHsgcmV0dXJuIHggKyAxOyB9Cn07CgpzdHJ1Y3QgdW5uYW1lZF9sYW1iZGEyCnsKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICBUIG9wZXJhdG9yKCkoVCB4KSBjb25zdCB7IHJldHVybiB4ICsgMjsgfQp9OwoKCnRlbXBsYXRlPGNsYXNzIHByb2Nlc3Nvcj4Kdm9pZCByZWZsZWN0KHByb2Nlc3NvciAmIHAsIHNvbWVfY2xhc3MmIHNjKQp7CiAgICByZWZsZWN0KHAsIHNjLmZpZWxkMSwgImZpZWxkMSIpOwogICAgcmVmbGVjdChwLCBzYy5maWVsZDIsICJmaWVsZDIiKTsKfQoKdGVtcGxhdGU8Y2xhc3MgdD4Kdm9pZCByZWZsZWN0KHVubmFtZWRfbGFtYmRhICYgcCwgdCYgdmFsLCBzdHJpbmcgc3RyKQp7CiAgICBjb3V0IDw8IHZhbCA8PCBlbmRsOwp9Cgp2b2lkIHByaW50X2hlbHBlcigpCnsKICAgIHVubmFtZWRfbGFtYmRhIGxhbWJkYSA9IHVubmFtZWRfbGFtYmRhe307CiAgICBzb21lX2NsYXNzIHNjOwoKICAgIHJlZmxlY3QobGFtYmRhLCBzYyk7Cn0KCnRlbXBsYXRlPGNsYXNzIHQ+CnZvaWQgcmVmbGVjdDIodW5uYW1lZF9sYW1iZGEyICYgcCwgdCYgdmFsLCBzdHJpbmcgc3RyKQp7CiAgICBjb3V0IDw8IHZhbCArIDEgPDwgZW5kbDsKfQoKdm9pZCBwcmludF9oZWxwZXIyKCkKewogICAgdW5uYW1lZF9sYW1iZGEyIGxhbWJkYSA9IHVubmFtZWRfbGFtYmRhMnt9OwogICAgc29tZV9jbGFzcyBzYzsKCiAgICByZWZsZWN0KGxhbWJkYSwgc2MpOwp9CgoKaW50IG1haW4oKSAKewogICAgcHJpbnRfaGVscGVyKCk7CiAgICBwcmludF9oZWxwZXIyKCk7CgogICAgc3lzdGVtKCJwYXVzZSIpOwoKICAgIHJldHVybiAwOwp9Cgo=
prog.cpp: In instantiation of 'void reflect(processor&, some_class&) [with processor = unnamed_lambda2]':
prog.cpp:62:23: required from here
prog.cpp:33:35: error: no matching function for call to 'reflect(unnamed_lambda2&, char&, const char [7])'
reflect(p, sc.field1, "field1");
^
prog.cpp:33:35: note: candidates are:
prog.cpp:31:6: note: template<class processor> void reflect(processor&, some_class&)
void reflect(processor & p, some_class& sc)
^
prog.cpp:31:6: note: template argument deduction/substitution failed:
prog.cpp:33:35: note: cannot convert 'sc.some_class::field1' (type 'char') to type 'some_class&'
reflect(p, sc.field1, "field1");
^
prog.cpp:38:6: note: template<class t> void reflect(unnamed_lambda&, t&, std::string)
void reflect(unnamed_lambda & p, t& val, string str)
^
prog.cpp:38:6: note: template argument deduction/substitution failed:
prog.cpp:33:35: note: cannot convert 'p' (type 'unnamed_lambda2') to type 'unnamed_lambda&'
reflect(p, sc.field1, "field1");
^
prog.cpp:34:35: error: no matching function for call to 'reflect(unnamed_lambda2&, bool&, const char [7])'
reflect(p, sc.field2, "field2");
^
prog.cpp:34:35: note: candidates are:
prog.cpp:31:6: note: template<class processor> void reflect(processor&, some_class&)
void reflect(processor & p, some_class& sc)
^
prog.cpp:31:6: note: template argument deduction/substitution failed:
prog.cpp:34:35: note: cannot convert 'sc.some_class::field2' (type 'bool') to type 'some_class&'
reflect(p, sc.field2, "field2");
^
prog.cpp:38:6: note: template<class t> void reflect(unnamed_lambda&, t&, std::string)
void reflect(unnamed_lambda & p, t& val, string str)
^
prog.cpp:38:6: note: template argument deduction/substitution failed:
prog.cpp:34:35: note: cannot convert 'p' (type 'unnamed_lambda2') to type 'unnamed_lambda&'
reflect(p, sc.field2, "field2");
^