#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
}