Возврат типа объекта; - PullRequest
1 голос
/ 02 октября 2010

Можно ли вернуть тип объекта?Например, я хотел бы иметь такую ​​конструкцию:

//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 ]

5 голосов
/ 02 октября 2010

Да, в некотором смысле, но вам нужно переместить 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));
0 голосов
/ 02 октября 2010

Я думаю, что вам просто нужно использовать специализацию шаблона функции:

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)
}
0 голосов
/ 02 октября 2010

В метапрограммировании шаблонов это обычно делается с помощью шаблонов классов.

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> можно рассматривать как (мета) функцию, принимающую один аргумент типа и возвращающую одно значение типа.

0 голосов
/ 02 октября 2010

В C ++ 0x есть decltype и auto, которые можно использовать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...