#include <cstdio> // // promotion trait class // template <typename T, typename S> struct Promotion { typedef typename Promotion<S,T>::Type Type; }; template <typename T> struct Promotion<T,T> { typedef T Type; }; template <> struct Promotion<int, double> { typedef double Type; }; // // checks for resulting types // void printType(int) { std::printf("called int-version\n"); } void printType(double) { std::printf("called double-version\n"); } template <typename T, typename S> void check(T, S) { typename Promotion<T,S>::Type promoted(); printType(promoted); } int main() { check(1, 1.0); check(1.0, 1); check(1, 1); check(1.0, 1.0); } |