Как одновременно создать псевдоним и экземпляр функции шаблона? - PullRequest
1 голос
/ 26 мая 2020

У меня есть следующая функция шаблона:

using namespace std::chrono;
using namespace std::chrono_literals;
template <typename D>
time_point<system_clock, D> makeTime(
   int year, int month, int day, int hour = 0, int minute = 0,
   int second = 0, int ms = 0, int us = 0, int ns = 0 );

Обычно я называю ее так: auto us_tp1 = makeTime<microseconds>( 2020, 5, 26, 21, 21, 21, 999, 123 );

Но теперь мне нужно вызвать ее где-нибудь через псевдоним " makeTimeUS "вот так:

auto us_tp1 = makeTimeUS( 2020, 5, 26, 21, 21, 21, 999, 123 );

точно так же makeTimeUS является экземпляром makeTime.

Я пробовал это:

using makeTimeUS = template time_point<system_clock, microseconds> makeTime;

и это:

using makeTimeUS = template time_point<system_clock, microseconds> makeTime(
 int, int, int, int, int, int, int, int, int );

, но ни один из них не может пройти компиляцию.

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

1 Ответ

3 голосов
/ 26 мая 2020

Вы можете получить указатель функции на нужную функцию и затем использовать его как свой «псевдоним». Это будет выглядеть так:

auto makeTimeUS = makeTime<microseconds>;

И может использоваться как:

auto us_tp1 = makeTimeUS( 2020, 5, 26, 21, 21, 21, 999, 123 );

Но это просто позволяет вам изменить имя. Поскольку это указатель на функцию, аргументы по умолчанию больше не работают, и вам все равно нужно указать все параметры.

Чтобы обойти это, вы можете создать оболочку вместо псевдонима с использованием лямбда, и это будет выглядеть как

auto makeTimeUS = [](int year, int month, int day, int hour = 0, 
                     int minute = 0, int second = 0, int ms = 0)
                  { 
                       return makeTime<microseconds>(year, month, day, hour, minute, second, ms); 
                  };
...