назначение и изменение типа данных во время компиляции (c )

#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:

Вообще говоря — нет. Переменные не могут изменять свой тип.

Существуют разные механизмы, которые похожи и решают подобные проблемы.

  1. Шаблоны — они позволяют работать с неопределенными структурами данных.

  2. Преобразование — довольно простое, вместо изменения типа данных переменной вы меняете тип данных значения.

  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>;
  

https://www.godbolt.org/z/f9vdMn