Это действует так.
fun();//return 1;
for (int i=0;i++;i<100)
fun();//return 2;
fun();//return 3;
Я не хочу делать это вручную, например:
static int i=0;
fun(){return i};
main()
{
i++;
fun();//return 1;
i++;
for (int i=0;i++;i<100)
fun();//return 2;
i++;
fun();//return 3;
}
Новые классы и статические переменные разрешены.
Я пытаюсь разработать алгоритм замены кэша. Большую часть времени я использую алгоритм LRU, но, если я использую алгоритм LRU внутри цикла, я очень вероятно получу перегрузку кеша.
https://en.wikipedia.org/wiki/Thrashing_(computer_science)
Мне нужно знать, нахожусь ли я в цикле. Тогда я могу использовать алгоритм LFU, чтобы избежать побоев.
Очевидным способом сделать это было бы использование __LINE__
макро. Он вернет номер строки исходного кода, который будет отличаться во всей вашей функции.
В c ++ функция не может знать, находится ли она внутри цикла 100% времени. Однако, если вы счастливы сделать некоторое ручное кодирование, чтобы сообщить функции, что она находится внутри цикла, тогда, используя параметры по умолчанию C ++, вы можете просто реализовать решение. Для получения дополнительной информации о параметрах по умолчанию см. http://www.learncpp.com/cpp-tutorial/77-default-parameters/. Кроме того, поскольку глобальные переменные обычно не одобряются, я поместил их в отдельное пространство имен, чтобы предотвратить конфликты.
namespace global_variables {
int i = 0;
}
int func(bool is_in_loop = false) {
if (is_in_loop)
{
//do_something;
return global_variables::i;
}
else
{
//do_something_else;
return global_variables::i++;
}
}
int main()
{
// Calling function outside of loop
std::cout << func();
// Calling function inside of loop
for (int j=0;j<100;j++)
{
// is_in_loop will be overided to be true.
std::cout << function(true);
}
return 0;
}