#include <iostream>
struct MyClass {};
template <typename T>
T do_something(T);
template<>
MyClass do_something(MyClass) { std::cout << "value" << std::endl; }
template<>
const MyClass& do_something(const MyClass&)
{
std::cout << "reference" << std::endl;
}
int main() {
MyClass c;
do_something<MyClass>(c); // value
do_something<const MyClass&>(c); // reference
do_something(c); // value
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IE15Q2xhc3Mge307Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KVCBkb19zb21ldGhpbmcoVCk7Cgp0ZW1wbGF0ZTw+Ck15Q2xhc3MgZG9fc29tZXRoaW5nKE15Q2xhc3MpIHsgc3RkOjpjb3V0IDw8ICJ2YWx1ZSIgPDwgc3RkOjplbmRsOyB9Cgp0ZW1wbGF0ZTw+CmNvbnN0IE15Q2xhc3MmIGRvX3NvbWV0aGluZyhjb25zdCBNeUNsYXNzJikKewoJc3RkOjpjb3V0IDw8ICJyZWZlcmVuY2UiIDw8IHN0ZDo6ZW5kbDsKfQoKCgppbnQgbWFpbigpIHsKCU15Q2xhc3MgYzsKCWRvX3NvbWV0aGluZzxNeUNsYXNzPihjKTsgLy8gdmFsdWUKCWRvX3NvbWV0aGluZzxjb25zdCBNeUNsYXNzJj4oYyk7IC8vIHJlZmVyZW5jZQoJZG9fc29tZXRoaW5nKGMpOyAvLyB2YWx1ZQp9