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