template<typename T>
type * convert();
template<>
type * convert<int>() { return getProperIntType(sizeof(int)); }
template<>
type * convert<intptr_t>() { return getProperIntType(sizeof(intptr_t)); }
//this template can be specialized with non-integral types as well,
// so I can't just use sizeof() as template parameter.
template<>
type * convert<void>() { return getProperVoidType(); }