Есть ли способ определить переменные двух разных типов в инициализаторе цикла for? - PullRequest
6 голосов
/ 15 мая 2009

Вы можете определить 2 переменные одного типа в цикле for:

int main() {
  for (int i = 0, j = 0; i < 10; i += 1, j = 2*i) {
    cout << j << endl;
  }
}

Но нельзя определять переменные разных типов:

int main() {
  for (int i = 0, float j = 0.0; i < 10; i += 1, j = 2*i) {
    cout << j << endl;
  }
}

Есть ли способ сделать это? (Мне не нужно использовать i внутри цикла, просто j.)

Если у вас есть полностью взломанное и неясное решение, это нормально для меня.

В этом надуманном примере я знаю, что вы можете просто использовать double для обеих переменных. Я ищу общий ответ.

Пожалуйста, не предлагайте перемещать какие-либо переменные за пределы для тела, вероятно, для меня это невозможно, поскольку один из них - итератор, который должен исчезнуть сразу после цикла, а оператор for должен быть включен в мой макрос foreach :

#define foreach(var, iter, instr) {                  \
    typeof(iter) var##IT = iter;                     \
    typeof(iter)::Element var = *var##IT;            \
    for (; var##_iterIT.is_still_ok(); ++var##IT, var = *var#IT) {  \
      instr;                                         \
    }                                                \
  }

Может использоваться таким образом:

foreach(ii, collection, {
  cout << ii;
}). 

Но мне нужно что-то, что будет использоваться так:

foreach(ii, collection)
  cout << ii;

Пожалуйста, не вносите никаких накладных расходов во время выполнения (но это может быть медленным при компиляции).

Ответы [ 13 ]

1 голос
/ 15 мая 2009

Вы говорите, что i - ваш собственный тип, и вам просто нужно сгенерировать j из i, верно? Легко. Добавьте функцию-член в класс i, чтобы сгенерировать значение j, и используйте его всегда. Вы можете даже сделать макрос, чтобы «скрыть» вызов этой функции-члена, если хотите. : -)

1 голос
/ 15 мая 2009
int main() {
  for (int i = 0, float j = 0.0; i < 10; i += 1, j = 2*i) {
    cout << j << endl;
  }
}

Может быть, я плотный, но зачем тебе вообще объявлять плавающее? Вы просто «выбрасываете это», когда выходите из цикла в любом случае. Правильно?

for(int i=0; i<10; ++i)
    cout << (float)2*i << endl;

Зачем тебе j?

0 голосов
/ 15 мая 2009

Почему бы вам просто не объявить и не инициализировать ваши переменные вне цикла for? Вы все еще можете тестировать и увеличивать, как у вас есть сейчас.

...