c++ - 如何同时别名和实例化模板函数?

标签 c++ templates alias instantiation using

我有以下模板功能:

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,就好像它是常规函数而不是模板一样。
谢谢!

最佳答案

您可以获取指向所需函数的函数指针,然后将其用作“别名”。看起来像:

auto makeTimeUS = makeTime<microseconds>;

可以像这样使用:
auto us_tp1 = makeTimeUS( 2020, 5, 26, 21, 21, 21, 999, 123 );

但这只是让您更改名称。由于它是一个函数指针,因此默认参数不再起作用,您仍然必须指定所有参数。

为了解决这个问题,您可以使用lambda而不是别名来包装,这看起来像
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); 
                  };

关于c++ - 如何同时别名和实例化模板函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62023379/

相关文章:

c++ - 使用 opencv 在 C++ 中将 3d 点从相机空间转换为对象空间

c++ - 如何获取模板类型的内部类型?

C++:如何返回模板类中定义的别名?

C++ 模板参数包别名扩展

c++ - 如何在C++中生成随机字符串

c++在模板中使用元组作为参数包

使用模板的 C++ 静态分派(dispatch)

linux - Bash:cd 到程序输出提供的目录

c++ - 如何使用相同的调用签名在张量中索引和分配元素?

c++ - 将 std::unique_ptr 传递给类时出错