返回一种对象;

时间:2010-10-02 16:23:14

标签: c++ templates

是否可以返回对象的类型?例如,我想构建这样的结构:

//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);  

4 个答案:

答案 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)
}