Информация об изменениях

Сообщение Re[5]: Аргументы-вариадики с продолжением от 18.09.2015 9:01

Изменено 18.09.2015 9:02 Molchalnik

Здравствуйте, Went, Вы писали:

W>Здравствуйте, Molchalnik, Вы писали:


M>>Здравствуйте, Went, Вы писали:

M>>думаю, концом рекурсии была бы функция с шаблонными параметрами template<typename T, typename Last>
W>Зачем? Если учесть, что в рассматриваемом примере аргумент format обязателен (нет значения по умолчанию, нет перегрузки без оного), то добавление такой функции создаст возможность допустить ошибку, закончив функцию не-интом.
W>Или в этой функции подразумевается static_assert(false)?

Блин. Ты спрашиваешь других или пытаешься убедить себя в своей правоте? Вот решение твоей задачи. Без всяких там костылей вроде статик ассертов


template<typename T> void print_internal(T a) {
  (void)a;
}

template<typename T>
void print(T a, int format)
{
  // Тут мы выводим а в консоль в формате format.
  (void)a;
  (void)format;
  printf("\nDone!!!");
}

template<typename T, typename... Args>
void print(T a0, Args... args)
{
  print_internal(a0);
  print(args...);
}

struct StType {
  int x;
  long y;
};

int main(int argc, char *argv[])
{
    StType st_x;
    print("f", 3);
    print("f", (long)5, 3);
    print("f",8,st_x,(long)3, (int)5);
    //print("f",8,st_x,(long)3, st_x); //если раскомментировать, то эта строка даст ошибку
}


Ты НЕ сделал окончание рекурсии грамотно — и поэтому у тебя или не работает, или костыли в виде ассертов.

Здесь ЕСТЬ правильное окончание рекурсии — и здесь и работает, и вызвать функцию print с последним аргументом, отличным от int НЕВОЗМОЖНО без ошибок компиляции.

И, что важно, использовать подсказку ты не захотел. Мне нужно было потратить своё время, сделать этот пример самому, для того, чтобы ты стал квалифицированнее и зарабатывал больше. Потому что ты повёл себя излишне самоуверенно и не подумал над ответом. Когда ты станешь получать больше, ты будешь присылать мне роялти?
Здравствуйте, Went, Вы писали:

W>Здравствуйте, Molchalnik, Вы писали:


M>>Здравствуйте, Went, Вы писали:

M>>думаю, концом рекурсии была бы функция с шаблонными параметрами template<typename T, typename Last>
W>Зачем? Если учесть, что в рассматриваемом примере аргумент format обязателен (нет значения по умолчанию, нет перегрузки без оного), то добавление такой функции создаст возможность допустить ошибку, закончив функцию не-интом.
W>Или в этой функции подразумевается static_assert(false)?

Блин. Ты спрашиваешь других или пытаешься убедить себя в своей правоте? Вот решение твоей задачи. Без всяких там костылей вроде статик ассертов


template<typename T> void print_internal(T a) {
  (void)a;
}

template<typename T>
void print(T a, int format)
{
  // Тут мы выводим а в консоль в формате format.
  (void)a;
  (void)format;
  printf("\nDone!!!");
}

template<typename T, typename... Args>
void print(T a0, Args... args)
{
  print_internal(a0);
  print(args...);
}

struct StType {
  int x;
  long y;
};

int main(int argc, char *argv[])
{
    StType st_x;
    print("f", 3);
    print("f", (long)5, 3);
    print("f",8,st_x,(long)3, (int)5);
    //print("f",8,st_x,(long)3, st_x); //если раскомментировать, то эта строка даст ошибку
}


вывод программы:

Done!!!
Done!!!
Done!!!


Ты НЕ сделал окончание рекурсии грамотно — и поэтому у тебя или не работает, или костыли в виде ассертов.

Здесь ЕСТЬ правильное окончание рекурсии — и здесь и работает, и вызвать функцию print с последним аргументом, отличным от int НЕВОЗМОЖНО без ошибок компиляции.

И, что важно, использовать подсказку ты не захотел. Мне нужно было потратить своё время, сделать этот пример самому, для того, чтобы ты стал квалифицированнее и зарабатывал больше. Потому что ты повёл себя излишне самоуверенно и не подумал над ответом. Когда ты станешь получать больше, ты будешь присылать мне роялти?