2014-01-04 2 views
3

Есть ли способ использования typeid или что-то подобное возвращаемому типу в C++?C++ typeid как возвращаемый тип

Например:

У меня есть собственная переменная в классе, который может быть установлен на любой тип. Как я смогу вернуть его, так как ниже не компилируется.

#include <type_traits> 

typeid(MyVariable) GetValue(){ 
    return MyVariable; 
} 
+0

Вы спрашиваете, как вернуть результат 'TypeID (...) выражение из функции? – Praetorian

+1

'std :: type_info GetType() {return typeid (MyVariable); } ', чтобы вернуть тип, а затем, возможно, void GetValue (void * ptr) {* (SomeType *) ptr = MyVariable; } '? Но это кажется действительно ужасным **. И это пахнет проблемой XY - * с какой проблемой вы пытаетесь решить это? * Возможно, вы просто ищете простой полиморфизм? –

+6

'typeid' используется, когда вам нужно исследовать измененное имя для типа, а не для вывода типа, в C++ 11 существуют' decltype' и 'auto', которые предназначены для этого. Кроме того, если ваш класс способен принимать «любой» тип, почему бы просто не использовать шаблонный тип «T» в качестве возвращаемого типа? – user2485710

ответ

3

Я предполагаю, что путаница здесь о том, что вы подразумеваете под «, который может быть установлен на любой тип».

Я читал, что один из четырех способов:

  1. Вы реализовал класс как импульс :: Любые и хочу скрыть его в своем классе возвращая его содержимое при вызове.
  2. У вас есть определение шаблона, где один из параметров шаблона содержит информацию о типе MyVariable
  3. Вы пытаетесь вернуть объект type_info для переменной, определенной с помощью подталкивание :: Любой аналог
  4. Вы пытаетесь вернуться объект type_info для переменной, определенной в шаблоне

Если 1 или 3:

template<typename T> T GetValue() { return any_cast<T>(MyVariable); } 
const std::type_info &GetValueType() { return MyVariable.type(); } 

вы не предоставили информацию о том, как ваш повышающего :: An y analog works, поэтому я только предположил, что это boost :: Any instance (который я лично никогда не использовал, поэтому давайте надеяться, что мой синтаксис верен). Это произойдет, если вы попытаетесь извлечь неправильный тип из MyVariable. Если вы предпочитаете иметь дело с указателями и NULL значения сделать это следующим образом:

template<typename T> T* GetValue() { return any_cast<T*>(&MyVariable); } 

Это возвращает указатель NULL, если T не тип элемента, хранящегося в переменной.

Если 2 или 4:

Ну, в этом случае у вас есть параметр шаблона где-нибудь, который определяет тип MYVARIABLE. Что-то вроде этого является то, что вы хотите:

template<typename T> class Holder { 
    T MyVariable; 
    T &GetValue() { return MyVariable; } 
    const std::type_info & GetValueType() { return typeid(T); } 
}; 

Ну, вот надеясь, что один из этих ответов соответствует вопрос, который вы пытались спросить :)

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