2016-07-01 3 views
-1

Я хотел бы сделать что-то вдоль линий:Сохранение типа и программно литье другого переменного хранимого типа

Type type = int; // or type_of(some_other_variable) 
double variable = 42.0; 
std::cout << (type)variable; 

Возможно ли это?

EDIT: То, что я действительно пытаюсь сделать, - это вариант Qt-стиля и VariantMap. Мой текущий код;

#include <string> 
#include <map> 
#include <iostream> 

struct Variant 
{ 
    bool m_bool; 
    int m_int; 
    double m_double; 
    std::string m_string; 

    Variant() {}; 
    Variant(bool bBoolean) { m_bool = bBoolean; } 
    Variant(int iInteger) { m_int = iInteger; } 
    Variant(double dDouble) { m_double = dDouble; } 
    Variant(std::string sString) { m_string = sString; } 
    Variant(const char *_Ptr) { m_string = _Ptr; } 

    operator bool() { return m_bool; } 
    operator int() { return m_int; } 
    operator double() { return m_double; } 
    operator std::string() { return m_string; } 
}; 

typedef std::map<std::string, Variant> VariantMap; 

int main() 
{ 
    VariantMap map; 
    map["bool"] = true; 
    map["int"] = 42; 
    map["double"] = 3.14159265358979323846; 
    map["string"] = "foobar"; 

    std::cout 
     << "bool " << static_cast<bool>(map["bool"]) << std::endl 
     << "int" << static_cast<int>(map["int"]) << std::endl 
     << "double " << static_cast<double>(map["double"]) << std::endl 
     << "string "<< static_cast<std::string>(map["string"]) << std::endl 
     ; 

    system("pause"); 



return 1; 
} 

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

+1

Вам действительно нужно сообщить нам, какую проблему вы пытаетесь решить. Просто рассказывая нам, как вы хотели бы его решить, нам не хватает информации. Например, возможно, что '#define type int 'решит вашу проблему. Но это также возможно, что не имеет ничего общего с вашей проблемой. Мы не можем сказать, потому что мы не знаем, какова ваша проблема. –

+0

Я сделал такое. верхнее сообщение теперь редактируется, чтобы включить объяснение моего приложения. – rogueyoshi

+0

Странно, что вы приняли ответ, который не отвечает на ваш реальный вопрос. Существует ответ, используйте дискриминированный союз с перегрузкой 'operator <<'. –

ответ

3
using type = int; // or: typedef int type; 
std::cout << static_cast<type>(variable); // prefer static_cast to C-style cast 

Теперь, если вы имеете в виду, что type не будет известно до момента выполнения (поскольку она зависит от пользовательского ввода, или что-то), то, что вы просите не возможно в C++.

+0

симпатичный пятно. как бы можно было сохранить тип как член класса? – rogueyoshi

+0

@rogueyoshi помещает декларацию 'using' или' typedef' внутри определения класса – Brian

+0

ах, но к сожалению это нельзя переопределить. есть ли решение? – rogueyoshi