Далее следует прямой ответ на вопрос, как задано.Как показывают комментарии к вопросу, было бы интересно узнать, почему вы спрашиваете об этом, то есть чего вы пытаетесь достичь.
Как пишет Оли в своем ответе, C ++ имеет статическую типизацию, поэтому нет, типпеременной нельзя изменить во время выполнения.
Однако, если вы заранее знаете набор типов, которые вы хотите для своей переменной (из вашего примера int
и float
), вы можете объявитьпеременная, тип которой "int or float".Это union
решение, на которое ссылаются другие ответы.Однако у union
есть свои причуды, и они довольно подвержены ошибкам.Более того, одного объединения обычно недостаточно, поскольку обычно требуется некоторая информация о текущем типе.
Приходит Boost.Variant , который является «дискриминируемым объединением» (объединениекоторый "знает" какой тип он сейчас держит).Это позволяет вам написать что-то вроде:
// Warning: off the top of my head, not compiled, less tested
boost::variant<int, float> int_or_float;
// Variants initialize by default as the first type in their list,
// so int_or_float is currently holding an int
assert(int_or_float.which() == 0);
int_or_float = 0.1;
// Now holding a float
assert(int_or_float.wich() == 1);