Да, в некотором смысле, но вам нужно переместить T
в параметр. Это условный трюк, который исследовал Эрик Ниблер и объяснил здесь .
template<typename T>
struct id { typedef T type; };
template<typename T>
id<T> make_id(T) { return id<T>(); }
struct get_type {
template<typename T>
operator id<T>() { return id<T>(); }
};
#define pass_type(E) (true ? get_type() : make_id((E)))
pass_type(expression)
дает объект id<T>
такой, что T
является cv-неквалифицированным типом этого выражения. Так что вы можете сделать
template<class T>
void f(int value, id<T>)
{
// Now go on as usual on T
}
f(value, pass_type(Object));