У меня есть функция f(), которая вызывается много раз в секунду, но в первый раз я бы хотел, чтобы она выполняла некоторые бухгалтерские операции.
Функция вызывает множество подпрограмм (например, A(); B(); C();), которые помещают информацию в буфер, который сбрасывается в файл каждые n шагов.
Проблема в том, что некоторые из подпрограмм могут помещать в буфер переменное количество элементов (от 0 до n) - то же самое для каждого вызова, но размер буфера (и, в частности, его ширина) необходимо определить заранее.
Одно из решений этой проблемы - вручную объявить объем данных, передаваемых каждой подпрограммой, но этого решения я бы хотел избежать.
Вместо этого я хотел бы выполнить своего рода вызов пробного прогона, который сохранял бы начальные позиции в буфере для каждой подпрограммы.
Вот как это выглядит при обычном выполнении:
void f(){
A();
B();
C();
}
Функции A, B, C изменяют значение переменной index, поэтому при первом запуске я бы хотел, чтобы она выполнялась:
void f(){
A();
a = index;
B();
b = index;
C();
c = index;
}
поэтому я могу использовать значения a, b, c позже. Я часами искал удовлетворительное решение с макросами и шаблонами, но потерпел неудачу. В настоящее время мое лучшее (и уродливое) решение:
void f(const bool first = false)
{
A();
if (first)
a = index;
B();
if (first)
b = index;
C();
if (first)
c = index;
}
или написать отдельную функцию, но должен быть способ получше ...
То, что все эти функции управляют глобальной переменной (?), Обычно является признаком ненадежного дизайна.
@cigien Да, вызывающий знает, в какое время вызывается функция. тадман ну может быть - но это индекс буфера, в который пишут все функции.





Не уверен, что понимаете, чего именно вы хотите ... и элегантность в глазах смотрящего ... но кажется, что использование тернарного оператора со ссылочной переменной может сделать ваш код немного (немного!) Более элегантным
я имею в виду
void f (bool const first = false)
{
int old_idx = idx;
int & x { first ? idx : old_idx };
A(), a = x;
B(), b = x;
C(), c = x;
}
Незапрошенное предложение вне темы: если я правильно понял, вы используете глобальные переменные; дайте возможность избежать этого: глобальные переменные - это неординарный источник неприятностей.
В любом случае ... это полный пример компиляции
#include <iostream>
int idx = 0;
void A () { idx += 1; }
void B () { idx += 2; }
void C () { idx += 3; }
int a{}, b{}, c{};
void f (bool const first = false)
{
int old_idx = idx;
int & x { first ? idx : old_idx };
A(), a = x;
B(), b = x;
C(), c = x;
}
int main()
{
f(true);
std::cout << a << ' ' << b << ' ' << c << '\n'; // print 1 3 6
f();
std::cout << a << ' ' << b << ' ' << c << '\n'; // print 6 6 6
}
"Использовать позже" означает кеш? Вы всегда можете установить как
static, но это глобально. Если по какой-то причине они должны быть для каждого объекта, это другое дело. Непонятно, что влечет за собой цель захвата этого значения иногда.