#include <iostream>
struct Test {
template <typename T> static bool Function(T x) { return true; }
};
// Magical template alias
template <typename T> constexpr auto funky1 = &Test::Function<T>;
// lambda means it'll infer the template parameters when calling
auto funky = [](auto in) { return funky1<decltype(in)>(in); };
int main() {
int x = 0;
// Just use the `funky1` version, but you have to specify the template parameters
std::cout << "string: " << funky1<std::string>("I'm a string") << std::endl
<< "int: " << funky1<int>(42) << std::endl
<< "bool: " << funky1<bool>(true) << std::endl;
// Use the `funky` version, where template parameters are inferred
std::cout << "string: " << funky("I'm a string") << std::endl
<< "int: " << funky(42) << std::endl
<< "bool: " << funky(true) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IFRlc3QgewogIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdGF0aWMgYm9vbCBGdW5jdGlvbihUIHgpIHsgcmV0dXJuIHRydWU7IH0KfTsKCi8vIE1hZ2ljYWwgdGVtcGxhdGUgYWxpYXMKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNvbnN0ZXhwciBhdXRvIGZ1bmt5MSA9ICZUZXN0OjpGdW5jdGlvbjxUPjsKCi8vIGxhbWJkYSBtZWFucyBpdCdsbCBpbmZlciB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycyB3aGVuIGNhbGxpbmcKYXV0byBmdW5reSA9IFtdKGF1dG8gaW4pIHsgcmV0dXJuIGZ1bmt5MTxkZWNsdHlwZShpbik+KGluKTsgfTsKCmludCBtYWluKCkgewogIGludCB4ID0gMDsKCiAgLy8gSnVzdCB1c2UgdGhlIGBmdW5reTFgIHZlcnNpb24sIGJ1dCB5b3UgaGF2ZSB0byBzcGVjaWZ5IHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzCiAgc3RkOjpjb3V0IDw8ICJzdHJpbmc6ICIgPDwgZnVua3kxPHN0ZDo6c3RyaW5nPigiSSdtIGEgc3RyaW5nIikgPDwgc3RkOjplbmRsCiAgICAgICAgICAgIDw8ICJpbnQ6ICIgPDwgZnVua3kxPGludD4oNDIpIDw8IHN0ZDo6ZW5kbAogICAgICAgICAgICA8PCAiYm9vbDogIiA8PCBmdW5reTE8Ym9vbD4odHJ1ZSkgPDwgc3RkOjplbmRsOwoKICAvLyBVc2UgdGhlIGBmdW5reWAgdmVyc2lvbiwgd2hlcmUgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgaW5mZXJyZWQKICBzdGQ6OmNvdXQgPDwgInN0cmluZzogIiA8PCBmdW5reSgiSSdtIGEgc3RyaW5nIikgPDwgc3RkOjplbmRsCiAgICAgICAgICAgIDw8ICJpbnQ6ICIgPDwgZnVua3koNDIpIDw8IHN0ZDo6ZW5kbAogICAgICAgICAgICA8PCAiYm9vbDogIiA8PCBmdW5reSh0cnVlKSA8PCBzdGQ6OmVuZGw7CgogIHJldHVybiAwOwp9