C++ 模板类的参数推导

考虑一个模板类,创建它的一个对象,代码如下:

template <typename T>
struct Holder {

    Holder(T t,bool is_null=false) 
    {
        is_null_ = is_null;
        data_ = t;
    }

    T data_;
    bool is_null_;
};

int main() {

    std::map<int, std::string> m{{1,"hello"},{2,"world"}};
    //类型必须写全!!
    Holder< std::map<int,std::string> > kk{ m, true };
    //采取auto也不能省事
    auto kk2 = Holder< std::map<int,std::string> >{ m, true };
}

为此,传统的解决方法是创建一个make_xxx模板函数,利用模板函数自动推导模板参数的超能力。

// ...

template<typename T>
auto make_holder(T t, bool is_null=false) {
    return Holder<T>(t, is_null);
}

int main() {

    std::map<int, std::string> m{};
    
    auto kk3 = make_holder(m, true);

}

std::make_pair , std::make_tuple , 都是这个原理。在C++17里,可以根据构造函数的参数,自动推导模板类的类型参数

int main() {

    std::map<int, std::string> m{};
   //Holder< std::map<int,std::string> > kk5{ m, true };   //太繁琐,不建议。能吓退很多初学者的恐怖语法。
    Holder kk5(m, true);  //C++17 , 简单了很多,对初学者很友好。
}

这样,对模板类的使用,就像普通类(非模板)的使用一致起来

转载于:https://www.cnblogs.com/thomas76/p/8540189.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值