C++17 之 "利用构造函数推导模板参数类型"

  • 演示用的模板类
  • C++17 之前的做法
  • C++17 的做法
  • 某些情况
  • 总结

在 C++17 之前,
通过向模板类的构造函数传递参数无法推导出类的模板参数类型.
一般要通过一个帮助函数来构造一个对象,
通过传递给帮助函数的参数推导出参数类型,
然后在帮助函数中返回一个构造好的对象. 下面介绍 C++17 之前的做法与
C++17 的便利性.

演示用的模板类

template <typename T1, typename T2, typename T3>
class my_class {
    T1 t1;
    T2 t2;
    T3 t3;
public:
    explicit my_class(T1 t1_, T2 t2_, T3 t3_)
    : t1{t1_}, t2{t2_}, t3{t3_}
    {}
};

C++17 之前的做法

要构造 my_class 的对象, 可以通过下面的方法

my_class<int, int, float> obj{1, 2, 3.0};

通过上面这种方法, 当使用时要指定一堆的模板参数, 使用不太方便,
因此可以定义一个帮助函数, 比如 make_my_class

my_class make_my_class(T1 t1, T2 t2, T3 t3)
{
    return {t1, t2, t3};
}

之后就可以通过下面的方法构造对象 my_obj, 可以得到模板类类型为
my_class.

auto my_obj (make_my_class(1, 2, 3.0));

C++17 的做法

在 C++17 中, 可以直接通过构造函数的参数类型来推导出模板参数类型.
因此可以象下面的方法构造对象 obj, 可以得到模板类类型为
my_class.

my_class obj(1, 2, 3.0);

某些情况

虽然 C++17 利用构造函数的参数类型来推导模板类型使用方便, 但有时候也无法推导,
考虑下面的类定义

// 模板类定义, 用于求和, 和存储于成员变量 value 中