【发布时间】:2019-12-25 01:52:17
【问题描述】:
在下面的示例中,我们使用 C++17 特性“类模板参数推导”来推导出 val 的类型为 Base<int, double, bool>:
template<class T, class U, class V>
struct Base {
Base(T, U) { };
Base(T, U, V) { };
Base(V) { };
};
void func() {
Base val(1, 4., false);
}
现在,是否可以部分指定模板参数,并推导出剩余的参数?实际上像这样的东西:
Base<V = bool> val1(1, 4.); // U & V deduced --> Base<int, double, bool>
Base<T = bool, T = int> val2(5.); // V deduced --> Base<bool, int, double>
我试过了,例如
template<class T, class U> using Base2 = Base<T, U, double>;
void func() {
NewBase2 val(1, 2);
}
但它无法编译:'Base2': use of alias template requires template argument list。
是否可以通过某种方式进行部分扣除?如果不能直接使用,有什么好的解决方法吗?
【问题讨论】:
-
在给出的示例中,您可以指定
T并推导出U并推导出V,或者指定T和U推导出V。看到图案了吗?在 C++ 中命名模板参数会很好,可惜我们没有。
标签: c++ c++17 template-argument-deduction class-template