C ++ Определить тип переменной и использовать ее в пределах sizeof () - PullRequest
1 голос
/ 17 июля 2011

Я хотел бы написать макрос на c ++, который бы давал значение 0 каждому элементу таблицы.Например, объявив i таким образом: int i[10];, макрос fill_with_zeros(i) даст такой эффект:

i[0] = 0;

i[1] = 0; и т. Д.

Это его код:

#define fill_with_zeros(xyz) \
    for(int l = 0 ; l < sizeof(xyz) / sizeof(int) ; l++) \
        xyz[l] = 0;

Проблема в том, что я хочу, чтобы он работал с таблицами нескольких типов: char, int, double и т. Д. И для этого мне нужна функция, которая бы определялатипа xyz, чтобы вместо sizeof(int) я мог использовать что-то вроде sizeof(typeof(xyz)).

Подобные темы существуют, но люди обычно хотят напечатать имя типа, тогда как мне нужно использовать имя в sizeof ().Есть ли способ сделать это?

Заранее спасибо

Ответы [ 6 ]

8 голосов
/ 17 июля 2011

Почему вы думаете, что вам нужен макрос для этого? Это должно работать:

// Beware, brain-compiled code ahead!
template< typename T, std::size_t sz >
inline void init(T (&array)[sz])
{
  std::fill( array, array+sz, T() );
}

Я бы ожидал, что моя реализация std lib оптимизирует std::fill() для вызова std::memset() (или чего-то подобного) самостоятельно, если T это позволяет.

Обратите внимание, что это фактически не обнуляет элементы, но использует объект, созданный по умолчанию для инициализации. Это достигается одинаково для всех типов, которые могут быть обнулены, плюс работает со многими типами, которые не могут.

3 голосов
/ 17 июля 2011

Почему бы просто не использовать memset(xyz, 0, sizeof(xyz));?

Все биты 0 = ноль для всех встроенных типов (целое число и число с плавающей точкой).

2 голосов
/ 17 июля 2011

Длина массива может быть определена как sizeof(xyz) / sizeof(xyz[0]). Однако уже есть функции ZeroMemory и memset, которые делают то, что вы хотите.

1 голос
/ 17 июля 2011

Вы должны использовать memset, как предлагали другие, но если вы действительно хотите пройти макро-маршрут:

#define fill_with_zeros(xyz) \
for(size_t l = 0 ; l < sizeof(xyz) / sizeof(xyz[0]) ; l++) \
    xyz[l] = 0;
1 голос
/ 17 июля 2011

Почему бы просто не использовать std::memset из <cstring>? Это то, для чего он был разработан и в большинстве случаев будет работать намного быстрее.

int i[10];
memset (i, 0, sizeof (i));
1 голос
/ 17 июля 2011
#define fill_with_zeroes(arr) \
    for (int l = 0; l < sizeof(arr) / sizeof(arr[0]); l++) \
        arr[l] = 0;

В качестве альтернативы просто позвоните memset(arr, 0, sizeof(arr));

Я бы предложил использовать memset или int i [10] = {0};

...