【问题标题】:C++ provide only undeducable template typesC++ 只提供不可推导的模板类型
【发布时间】:2021-02-27 05:51:49
【问题描述】:

假设我们有一个依赖于两种模板类型的类,其中一种是我们专门研究构造函数,我们可以不专门研究可推导类型吗?

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++ metaprogramming c++20 ctad


    【解决方案1】:

    在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

    【讨论】:

    • 不添加新模板类型就不行吗?
    • 或者至少以更通用的方式,所以我不会为每个案例创建一个新的使用
    • @VladyslavMozhvylo 除了构造函数之外,类中的其他任何地方都需要typename I吗?
    • 是的,我会有这种类型的成员
    • @VladyslavMozhvylo 我已经更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2017-05-29
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多