C++ 只提供不可推导的模板类型
C++ provide only undeducable template types
假设我们有 class 依赖于两种模板类型,其中一种我们专门研究构造函数,我们可以不专门研究可推导类型吗?
template <typename T, typename I>
class A {
public:
A(I i) {
}
};
int main() {
A<float, int> a(42); // this works, but we can deduce int from 42
A<float> aa(42); // doesn't work
//or
auto aaa = A<float>(42); // doesn't work
}
在 C++20 中,您可以像这样使用别名模板推导:
template <typename I>
using A_float = A<float, I>;
int main() {
A_float a(42);
auto aa = A_float(42);
}
在 godbolt.org 上试用:Demo。
或者,您可以定义一个 make
函数并从函数参数推导出 I
。因为copy elision,这并不比直接构造A
效率低:
template <typename T, typename I>
auto make_a(I i) { return A<T, I>(i); }
int main() {
auto a = make_a<float>(42);
}
在 godbolt.org 上试用:Demo。
假设我们有 class 依赖于两种模板类型,其中一种我们专门研究构造函数,我们可以不专门研究可推导类型吗?
template <typename T, typename I>
class A {
public:
A(I i) {
}
};
int main() {
A<float, int> a(42); // this works, but we can deduce int from 42
A<float> aa(42); // doesn't work
//or
auto aaa = A<float>(42); // doesn't work
}
在 C++20 中,您可以像这样使用别名模板推导:
template <typename I>
using A_float = A<float, I>;
int main() {
A_float a(42);
auto aa = A_float(42);
}
在 godbolt.org 上试用:Demo。
或者,您可以定义一个 make
函数并从函数参数推导出 I
。因为copy elision,这并不比直接构造A
效率低:
template <typename T, typename I>
auto make_a(I i) { return A<T, I>(i); }
int main() {
auto a = make_a<float>(42);
}
在 godbolt.org 上试用:Demo。