#include <iostream>
#include <string>
#include <functional>
template <typename T>
void print(T t){
std::cout << t<<std::endl;
}
template <typename T>
void print(T t,std::function<void(T& t)> transformer){
transformer(t);
std::cout << t << std::endl;
}
template <typename... Params>
void printLabeled(std::string label,Params... params){
std::cout << label << ": ";
print(params...);
}
int main() {
//prints the number '1', as expected
print(1);
//prints the number the label "answer" and then the number one
printLabeled("answer",1);
//I intended this to increment 1 to 2 and then print 2,
//but I guess the lambda does not get converted to an std::function,
//so this doesn't work
//print(1,[](int& num){num+=1;});
//This does was the above line was intended to do
print(1,{[](int& num){num+=1;}});
//I intended this to be the labeled version of the above line,
//but for some reason, this doesn't work anymore
// printLabeled("answer",1,{[](int& num){num+=1;}});
//This labeled version does work finally,
//but its pretty verbose
printLabeled("answer",1,std::function<void(int&)>([](int& num){num+=1;}));
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp2b2lkIHByaW50KFQgdCl7CglzdGQ6OmNvdXQgPDwgdDw8c3RkOjplbmRsOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kdm9pZCBwcmludChUIHQsc3RkOjpmdW5jdGlvbjx2b2lkKFQmIHQpPiB0cmFuc2Zvcm1lcil7Cgl0cmFuc2Zvcm1lcih0KTsKCXN0ZDo6Y291dCA8PCB0IDw8IHN0ZDo6ZW5kbDsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFBhcmFtcz4Kdm9pZCBwcmludExhYmVsZWQoc3RkOjpzdHJpbmcgbGFiZWwsUGFyYW1zLi4uIHBhcmFtcyl7CglzdGQ6OmNvdXQgPDwgbGFiZWwgPDwgIjogIjsKCXByaW50KHBhcmFtcy4uLik7Cn0KCmludCBtYWluKCkgewoJLy9wcmludHMgdGhlIG51bWJlciAnMScsIGFzIGV4cGVjdGVkCglwcmludCgxKTsKCQoJLy9wcmludHMgdGhlIG51bWJlciB0aGUgbGFiZWwgImFuc3dlciIgYW5kIHRoZW4gdGhlIG51bWJlciBvbmUKCXByaW50TGFiZWxlZCgiYW5zd2VyIiwxKTsKCQoJLy9JIGludGVuZGVkIHRoaXMgdG8gaW5jcmVtZW50IDEgdG8gMiBhbmQgdGhlbiBwcmludCAyLAoJLy9idXQgSSBndWVzcyB0aGUgbGFtYmRhIGRvZXMgbm90IGdldCBjb252ZXJ0ZWQgdG8gYW4gc3RkOjpmdW5jdGlvbiwKCS8vc28gdGhpcyBkb2Vzbid0IHdvcmsKCS8vcHJpbnQoMSxbXShpbnQmIG51bSl7bnVtKz0xO30pOwoJCgkvL1RoaXMgZG9lcyB3YXMgdGhlIGFib3ZlIGxpbmUgd2FzIGludGVuZGVkIHRvIGRvCglwcmludCgxLHtbXShpbnQmIG51bSl7bnVtKz0xO319KTsKCQoJLy9JIGludGVuZGVkIHRoaXMgdG8gYmUgdGhlIGxhYmVsZWQgdmVyc2lvbiBvZiB0aGUgYWJvdmUgbGluZSwKCS8vYnV0IGZvciBzb21lIHJlYXNvbiwgdGhpcyBkb2Vzbid0IHdvcmsgYW55bW9yZQoJLy8gcHJpbnRMYWJlbGVkKCJhbnN3ZXIiLDEse1tdKGludCYgbnVtKXtudW0rPTE7fX0pOwoJCgkvL1RoaXMgbGFiZWxlZCB2ZXJzaW9uIGRvZXMgd29yayBmaW5hbGx5LAoJLy9idXQgaXRzIHByZXR0eSB2ZXJib3NlCglwcmludExhYmVsZWQoImFuc3dlciIsMSxzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50Jik+KFtdKGludCYgbnVtKXtudW0rPTE7fSkpOwoJcmV0dXJuIDA7Cn0=