返回介绍

用作模板参数的局部类型

发布于 2025-02-26 23:19:57 字数 1462 浏览 0 评论 0 收藏 0

在 C++98 中,局部类和未命名类不能作为模板参数,这或许是一个负担,C++11 则放宽了这方面的限制:

void f(vector<X>& v)
{
    struct Less {
        bool operator()(const X& a, const X& b)
        { return a.v<b.v; }
    };
    // C++98: 错误: Less 是局部类
        // C++11: 正确
        sort(v.begin(), v.end(), Less());
}

当然除了这里的局部类之外,在 C++11 中,我们还可以采用 Lambda 表达式来做同样的事情:

void f(vector<X>& v)
{
    sort(v.begin(), v.end(),
        [] (const X& a, const X& b) { return a.v<b.v; });
}

尽管如此,我们仍然不要忘记,为一系列动作行为命名有利于文档化,是一个值得鼓励的设计风格。而且,非局部的函数体(当然也需要命名)还可以被重用于其他模块。

C++11 同时也允许模板参数使用未命名类型的值:

template<typename T> void foo(T const& t){}
enum X { x };
enum { y };

int main()
{
    foo(x);     // C++98: ok; C++11: ok
    //(译注:y 是未命名类型的值,C++98 无法从这样的值中推断出函数模板参数)
    foo(y);     // C++98: error; C++11: ok
    enum Z { z };
    foo(z);     // C++98: error; C++11: ok
    //(译注:C++98 不支持从局部类型值推导模板参数
}

参考:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文