#include <iostream>

template<class From, class To, class Value>
struct convert
{
    static Value apply(Value value)
    {
        std::cout << "different\n";
        return value;
    }
};

template<class From, class Value>
struct convert<From,From,Value>
{
    static Value apply(Value value)
    {
        std::cout << "same\n";
        return value;
    }
};

int main()
{
    convert<int,long,long>::apply(0L);
    convert<int,int,long>::apply(0L);
}