CppCoreGuidelines T.44 用函数模板推演出模板参数类型(尽可能的)
12 September 2023
“Use function templates to deduce class template argument types (where feasible)”
理由
明确地写明模板参数类型会很繁琐,也没必要。
例子
tuple<int, string, double> t1 = {1, "Hamlet", 3.14}; // explicit type auto t2 = make_tuple(1, "Ophelia"s, 3.14); // better; deduced type
注意这里用到的 s
后缀。它强调这个字符串是 std::string
而非 C 风格字符串。
注意
你可以很轻易写出一个 make_T
函数,编译器也能办到。所以,未来 make_T
函数可能是多余的。
例外
有时候,没有好办法可以推演出模板参数类型,所以,可能需要你指明参数:
vector<double> v = { 1, 2, 3, 7.9, 15.99 }; list<Record*> lst;
注意
C++17 允许模板参数直接从构造函数的参数中引出,所以这个规则可能变的多余。比如:
tuple t1 = {1, "Hamlet"s, 3.14}; // deduced: tuple<int, string, double>
强化
- 标注明确指定的实例化类型的参数和模板参数一样的情况。