2010-10-02 2 views
1

Возможно ли вернуть тип объекта? Например, я хотел бы иметь построить так:Возвращает тип объекта;

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

, а затем в основной:

f<getType(Object)>(value); 

ответ

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)); 
+0

Это потрясающе. – GManNickG

0

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

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

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) 
} 
+0

Я думаю, что все. Я проверю это, и я дам вам знать. Спасибо за Ваш ответ. –

+0

Как он отличается от перегрузки функции? – atzz

+0

Поскольку это простая функция, я думаю, это не совсем так, так что просто перегрузка функций будет достаточной, но окончательный шаблон все-таки будет необходим. – JBRWilkinson

Смежные вопросы