// functional_test.cpp : Defines the entry point for the console application.
//
#include <functional>
#include <iostream>
template<class T1, class T2>
inline void dump(const T1 &f1, const T2 &f2)
{
std::cout << std::boolalpha
<< "f1 : " << static_cast<bool>(f1) << std::endl
<< "f2 : " << static_cast<bool>(f2) << std::endl;
}
int main(int , char* [])
{
std::function<void(void*)> f1;
std::function<void(const void*)> f2;
std::cout << "Initial state: " << std::endl;
dump(f1,f2);
// Expected compilation fail
//std::cout << "assign value of f1 to f2: " << std::endl;
//f2 = f1;
//dump(f1,f2);
std::cout << "Assign value of f2 to f1: " << std::endl;
f1 = f2; // Could fail, but didn't
dump(f1,f2); // Should give false/false but outputs true/false
try {
if(f1)
f1(nullptr);
else
std::cout << "Skip f1" << std::endl;
if(f2)
f2(nullptr);
else
std::cout << "Skip f2" << std::endl;
}
catch(const std::exception &e) {
std::cerr << "Exception: " << e.what() << std::endl;
}
return 0;
}
Ly8gZnVuY3Rpb25hbF90ZXN0LmNwcCA6IERlZmluZXMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgY29uc29sZSBhcHBsaWNhdGlvbi4KLy8KCiNpbmNsdWRlIDxmdW5jdGlvbmFsPgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp0ZW1wbGF0ZTxjbGFzcyBUMSwgY2xhc3MgVDI+CmlubGluZSB2b2lkIGR1bXAoY29uc3QgVDEgJmYxLCBjb25zdCBUMiAmZjIpCnsKCXN0ZDo6Y291dCA8PCBzdGQ6OmJvb2xhbHBoYSAKCQk8PCAiZjEgOiAiIDw8IHN0YXRpY19jYXN0PGJvb2w+KGYxKSA8PCBzdGQ6OmVuZGwKCQk8PCAiZjIgOiAiIDw8IHN0YXRpY19jYXN0PGJvb2w+KGYyKSA8PCBzdGQ6OmVuZGw7Cn0KCgppbnQgbWFpbihpbnQgLCBjaGFyKiBbXSkKewoJc3RkOjpmdW5jdGlvbjx2b2lkKHZvaWQqKT4gZjE7CglzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgdm9pZCopPiBmMjsKCglzdGQ6OmNvdXQgPDwgIkluaXRpYWwgc3RhdGU6ICIgPDwgc3RkOjplbmRsOwoJZHVtcChmMSxmMik7CgoJLy8gRXhwZWN0ZWQgY29tcGlsYXRpb24gZmFpbAoJLy9zdGQ6OmNvdXQgPDwgImFzc2lnbiB2YWx1ZSBvZiBmMSB0byBmMjogIiA8PCBzdGQ6OmVuZGw7CgkvL2YyID0gZjE7CgkvL2R1bXAoZjEsZjIpOwoKCXN0ZDo6Y291dCA8PCAiQXNzaWduIHZhbHVlIG9mIGYyIHRvIGYxOiAiIDw8IHN0ZDo6ZW5kbDsKCWYxID0gZjI7IC8vIENvdWxkIGZhaWwsIGJ1dCBkaWRuJ3QKCWR1bXAoZjEsZjIpOyAvLyBTaG91bGQgZ2l2ZSBmYWxzZS9mYWxzZSBidXQgb3V0cHV0cyB0cnVlL2ZhbHNlCgoJdHJ5IHsKCQlpZihmMSkKCQkJZjEobnVsbHB0cik7CgkJZWxzZSAKCQkJc3RkOjpjb3V0IDw8ICJTa2lwIGYxIiA8PCBzdGQ6OmVuZGw7CgoJCWlmKGYyKQoJCQlmMihudWxscHRyKTsKCQllbHNlIAoJCQlzdGQ6OmNvdXQgPDwgIlNraXAgZjIiIDw8IHN0ZDo6ZW5kbDsKCX0gCgljYXRjaChjb25zdCBzdGQ6OmV4Y2VwdGlvbiAmZSkgIHsKCQlzdGQ6OmNlcnIgPDwgIkV4Y2VwdGlvbjogIiA8PCBlLndoYXQoKSA8PCBzdGQ6OmVuZGw7Cgl9CgoJcmV0dXJuIDA7Cn0KCg==