#c
#c
Вопрос:
хорошо, это просто дикая идея. Можете ли вы указать тип переменной в переменной во время компиляции?
type
содержит int
, а затем вы меняете его на char
И вы решили изменить его снова! type
содержит объект класса. просто продолжайте его изменять
И его можно использовать как
type = int;
type var = 5; ( when type was assigned to int )
type = std::string
type var_2 = "hello" ( when type was assigned to std::string )
Комментарии:
1. Это концепция std::variant
2. Так ли это? An
std::variant
— это один объект, который может иметь много типов. Речь идет, например, о сохранении результатаdecltype(foo)
в переменной.3. Немного неясно, что именно вы пытаетесь сделать. Тип переменной определяется во время компиляции, так какую идею вы ищете в своей
type
«переменной»?4. Лучший ответ — программирование шаблонов. Если вы могли бы предоставить подробную информацию о вашей проблеме, кто-нибудь даст вам хороший пример, как написать шаблон для вашей конкретной проблемы.
Ответ №1:
Вы можете сделать это с помощью макросов.
#undef type
#define type int
type var = 5;
#undef type
#define type char
type var2 = 'a';
Однако это будет крайне запутанным, я настоятельно рекомендую этого не делать.
Комментарии:
1. Не забудьте
#undef type
повторить, когда закончите.2. @RemyLebeau Я предполагаю, что он всегда отменяет определения перед отменой
3. макросы фу. Почему бы не использовать для этого программирование шаблонов?
4. @MarekR Потому что это, по-видимому, наиболее соответствует варианту использования OP.
5. @Barmar
#define
не выполняется автоматически#undef
, и если вы#define
что-то дважды с разными значениями, вы, скорее всего, получите предупреждение. Кроме того, вы не всегда знаете, повлияет ли ваше#define
действие на что-либо еще в будущем, выходящее за рамки того, для чего вы намеревались его использовать, поэтому лучше#undef
всего явно указать, когда вы закончите использовать общее#define
значение.
Ответ №2:
Помимо синтаксических ошибок, вы не можете использовать
type = int;
type = std::string;
в той же области.
Если вы хотите использовать другие области, вы можете использовать:
{
// One scope
using type = int;
type var = 5;
}
{
// New scope
using type = std::string;
type var_2 = "hello";
}
PS
Я не рекомендую использовать псевдонимы типов для основных типов и типов в стандартной библиотеке. Это затрудняет чтение и понимание кода.
Ответ №3:
Вообще говоря — нет. Переменные не могут изменять свой тип.
Существуют разные механизмы, которые похожи и решают подобные проблемы.
-
Шаблоны — они позволяют работать с неопределенными структурами данных.
-
Преобразование — довольно простое, вместо изменения типа данных переменной вы меняете тип данных значения.
-
Полиморфизм — вы можете хранить несколько классов одного и того же типа в одном контейнере, поэтому, допустим, у вас есть:
Класс A; Класс B: A; Класс C: A;
std::list<A> listOfA; B b; C c; listOfA.append(B); listOfA.append(C);
Таким образом, у вас как бы несколько «типов» в одной переменной.
Ответ №4:
IMO лучший и наиболее гибкий способ подойти к этому — использовать шаблоны. Макросы небрежны и опасны (имеют много недостатков).
template<typename T>
constexpr T defaultValue = T{};
template<>
constexpr int defaultValue<int> = 5;
template<>
const std::string defaultValue<std::string> = "hello";
...
auto x = defaultValue<int>;
auto s = defaultValue<std::string>;
auto y = defaultValue<size_t>;