是否可以返回对象的类型?例如,我想构建这样的结构:
//pseudocode
template<class T>
void f(int value)
{
//depends on type T different action can be taken
}
template<class T>
type getType(T obj)
{
return (type of obj);
}
然后在main:
f<getType(Object)>(value);
答案 0 :(得分:5)
在某种意义上是肯定的,但您需要将T
移动到参数中。这是Eric Niebler探讨的条件技巧并解释了here。
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));
答案 1 :(得分:0)
在C ++ 0x中,可以使用decltype和auto
答案 2 :(得分:0)
在模板元编程中,这通常是通过类模板完成的。
template <typename T>
struct GetType
{
typedef T type; // usually it's something more complex
};
// example: partial specialization is used to compute element type of some container template
template <typename T>
struct GetType< MyContainerType<T> >
{
typedef T type;
};
.........................
// and now you use it:
f<GetType<Object>::type>(value);
这里,struct GetType<T>
可以被认为是一个(meta)函数,它接受一个类型参数并返回一个类型值。
答案 3 :(得分:0)
我认为你只需要使用功能模板专业化:
template<>
void f(int value)
{
.. operations when an int
}
template<>
void f(char value)
{
.. operations when a char
}
template<>
void f(double value)
{
.. operations when a double
}
template<class T>
void f(T value)
{
.. operations when a T (not int, char or double)
}