У меня есть код, который мне не разрешено изменять:
Jd const nowJD( WTIMEOFDAY );
Jd const nowJDN( NOTIMEOFDAY );
В файле модульного теста нет упоминаний о WTIMEOFDAY или NOTIMEOFDAY. Я должен определить их где-то.
Я строю некоторые юлианские даты, и мне нужно иметь возможность вызывать функцию, используя только WTIMEOFDAY или NOTIMEOFDAY. Оба из них должны возвращать юлианскую дату или юлианский номер дня. Я не могу использовать параметры или скобки в моем вызове.
Это одно из объявлений функций:
jd_t NOTIMEOFDAY();
Это его определение:
jd_t Jd::NOTIMEOFDAY() {
time_t nowTime = time(NULL);
struct tm tmNow;
localtime_s(&tmNow, &nowTime);
jd_ = gregorian_to_jd(
tmNow.tm_year + 1900,
month_t(tmNow.tm_mon + 1),
day_t(tmNow.tm_mday)
);
}
Это код из тестового примера с использованием WTIMEOFDAY и NOTIMEOFDAY:
BOOST_AUTO_TEST_CASE( test_Jd_ctor_default_no_time_of_day ) {
time_t utcTime = time(NULL);
struct tm tmLocal;
localtime_s( &tmLocal, &utcTime );
Jd const nowJD( WTIMEOFDAY );
Jd const nowJDN( NOTIMEOFDAY );
jd_t jdn = gregorian_to_jd( tmLocal.tm_year + 1900, month_t( tmLocal.tm_mon + 1 ), day_t( tmLocal.tm_mday ) );
BOOST_CHECK_EQUAL( nowJDN.jd(), jdn );
jd_t jd = gregorian_to_jd(
tmLocal.tm_year + 1900, month_t(tmLocal.tm_mon + 1), day_t(tmLocal.tm_mday),
hour_t(tmLocal.tm_hour), minute_t(tmLocal.tm_min), second_t(tmLocal.tm_sec) );
BOOST_CHECK_EQUAL( nowJD, jd );
}
Как я могу сделать так, чтобы NOTIMEOFDAY и WTIMEOFDAY указывали на функцию, которая будет возвращать текущий номер дня в Юлиане и дату в Юлиане, соответственно. Я только когда-либо вызывал функцию, используя формат foo ().
Это определение конструктора Jd:
Jd( jd_t jd ) : jd_( jd ) { }
Вам нужно будет использовать
#define NOTIMEOFDAY Jd::now()
А затем переименуйте свою функцию соответственно.
Это тот тип хакерства, для которого были разработаны макросы C. Иногда нет более элегантного решения.
Я не уверен, что это именно то, что хотел Гарт, но я сделал WTIMEOFDAY constexpr
определяется как char = 'a'
и сделал специальный конструктор, который принимает char
отмечает и создает его с временем дня или без него на основе значения флага.