Принудительно определить статическую константу внутри функции во время запуска?

Рассмотрим следующую программу: LWS

#include <iostream>
#include <chrono>

void test()
{
static const std::chrono::high_resolution_clock::time_point marker
= std::chrono::high_resolution_clock::now();
std::cout<<marker.time_since_epoch().count()<<std::endl;
}

int main(int argc, char* argv[])
{

std::cout<<std::chrono::high_resolution_clock::now()
.time_since_epoch().count()<<std::endl;
std::cout<<"--------"<<std::endl;
test();
std::cout<<"--------"<<std::endl;
test();
return 0;
}

С g ++ результат:

1363389335665993
--------
1363389335666701
--------
1363389335666701

Который означает, что markerстатическая постоянная внутри test() Функция оценивается во время первого вызова этой функции. Есть ли способ или хитрость (кроме объявления marker в качестве глобальной переменной), чтобы заставить оценку marker в начале программы?

1

Решение

Нет. Статика в функции оценивается при первом вызове функции. Если вам нужно, чтобы он оценивался раньше, он должен стать глобальным. Одна альтернатива — просто вызвать функцию в начале программы, чтобы оценить статическое значение перед тем, как вам действительно понадобится функция.

2

Другие решения

Вы можете подделать функцию с классом, например, так:

struct test_
{
const std::chrono::high_resolution_clock::time_point marker;

test_()
: marker( std::chrono::high_resolution_clock::now() )
{}

void operator()() const
{
std::cout<<marker.time_since_epoch().count()<<std::endl;
}
} test;

хотя это, вероятно, слишком много хака, чтобы его можно было использовать на практике.

1

По вопросам рекламы [email protected]