【问题标题】:Using template alias over template在模板上使用模板别名
【发布时间】:2021-01-08 22:43:02
【问题描述】:

看书A tour of c++ (second edition), 2018,没看懂模板的解释(下面我会解释)。

find_all 函数提供了两个函数签名,该函数将iterators 中的vector 返回给给定container 中给定值的所有出现。

#1:

template<typename C, typename V>
vector<typename C::iterator> find_all(C& c, V v);

#2:

template<typename T>
using Iterator = typename T::iterator;
template<typename C, typename V>
vector<Iterator<C>> find_all(C& c, V v) ;

两者都可以这样使用:

string m {"Mary had a little lamb"};
for (auto p : find_all(m,'a')) // here p is a string::iterator
    cout << *p << endl; // spoiler alert : this will print 'a's

#2 使用别名模板据说是

通过为 Iterator 引入类型别名来隐藏实现细节

作者。

虽然我认为我了解模板的两种用法,但我不明白为什么 #2 会“隐藏实现细节”以及为什么首选它......谁能解释一下?

谢谢!

postscriptum :我没有在帖子中提供函数的定义(两个签名相同),因为我认为它没有用,但如果有人需要,我会添加它.

【问题讨论】:

    标签: c++ templates c++17


    【解决方案1】:

    假设你有一个类似的代码库

    template<typename C, typename V>
    vector<typename C::iterator> first(C& c, V v);
    template<typename C, typename V>
    vector<typename C::iterator> second(C& c, V v);
    template<typename C, typename V>
    vector<typename C::iterator> third(C& c, V v);
    template<typename C, typename V>
    vector<typename C::iterator> fourth(C& c, V v);
    ...
    

    如果您决定要更改为返回const_iterator 的向量而不是iterator,则需要更改所有这些函数。使用时

    template<typename T>
    using Iterator = typename T::iterator;
    template<typename C, typename V>
    vector<Iterator<C>>  first(C& c, V v);
    template<typename C, typename V>
    vector<Iterator<C>>  second(C& c, V v);
    template<typename C, typename V>
    vector<Iterator<C>>  third(C& c, V v);
    template<typename C, typename V>
    vector<Iterator<C>>  fourth(C& c, V v);
    

    你要做的就是改变

    template<typename T>
    using Iterator = typename T::iterator;
    

    template<typename T>
    using Iterator = typename T::const_iterator;
    

    你就完成了。这就是它“隐藏实现细节”的方式。

    【讨论】:

    • 看,我是按照这些思路思考的,但我想到的是specializing using,这显然不是一回事。这个概念更有意义。
    • @limserhane:还要考虑在= 的右侧可以有一个任意复杂的表达式(只要它产生一个类型)。别名通常会将其变成一种非常简单易懂的类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多