【问题标题】:Overloading/specializing STL algorithms for non-local containers (database back end)为非本地容器重载/专门化 STL 算法(数据库后端)
【发布时间】:2010-08-18 19:51:51
【问题描述】:

我想做的是,在一个单独的命名空间中,定义我自己的 sort()、copy() 等实现,这些实现与数据库表/视图/等容器一起使用,而不是内存中的 std 容器。如果我定义自己的 sort() 来接受我的自定义转发迭代器,编译器如何解决这个问题?或者,我需要做什么才能正确解析,即使用我的自定义 sort() 而不是 std sort(),即使我可能传入符合标准迭代器类型要求的自定义迭代器类型?

如果它使用 std sort(),它实际上仍然可以工作,只是效率极低,因为它不会将排序移交给数据库,而我的 sort() 实现会。当它们具有相同的名称并接受相同的类型时,我只是不确定如何通过 std sort() 正确调用我的 sort() 。我的描述中可能遗漏了一些细节,所以请耐心等待我解决这个问题。

另外,我发现以下问题与我所问的问题最相似(提到 ADL 和部分专业化),但我不确定它是否直接解决了我的问题或描述了做事的最佳方式我所描述的: Overloading for_each for specific iterator types

【问题讨论】:

    标签: c++ templates function stl overloading


    【解决方案1】:

    为您自己的 UDT 专门化 std 命名空间算法实际上是定义的行为。

    namespace std {
        template<> void sort<sometype::someiterator>(sometype::someiterator begin, sometype::someiterator end) {
        ...
        }
    };
    

    编辑:Oopsie 排序而不是排序。

    再次编辑:哦,伙计,我写的东西完全错了。这根本不是明确的规范语法。

    【讨论】:

    • 好的,我想我明白了,如果我弄错了,请纠正我。 RIterator 最终会成为我的 DBContainer 的自定义迭代器,对吗?所以基本上我是在告诉编译器,“我知道你已经有了一个通用的 sort(),但是这个 sort() 会比你的 sort() 更好地处理这些特定类型。”我可以在不同的命名空间中定义该排序并获得相同的结果吗?
    • @pheadbaq:抱歉,意图是正确的,但代码错误。你是对的,编译器会选择你的专业而不是通用的 std::sort。您可以在另一个命名空间中定义它,但您还必须定义一个泛型排序(这是现有函数的专门化),此外,您将失去与第三方代码的兼容性,并且会搞砸团队中没有使用正常排序的每个人。
    • 请耐心等待,专业化问题的新手:\ 因此,如果我在 std 命名空间中定义我的自定义排序,然后声明“使用 std”,那么当我通过我的自定义迭代器进行排序时,没有完全限定它,编译器会选择我的专用版本。但是,如果我在其他命名空间“foo”中定义排序,然后声明“使用 std”和“使用 foo”并调用非限定排序并将其传递给我的自定义迭代器,这会破坏我在手动调用正确排序的能力我的迭代器到使用 std::sort 的 3rd 方代码,我的团队必须明确定义哪种排序?对吗?
    • 我认为它变得越来越清晰......如果我坚持使用 std 命名空间,我可以提供我的专业版本。如果我打破 std 命名空间,为了只调用一个排序,我必须提供我的专业化和替换通用排序,并且新的通用排序仍然不会被第 3 方的东西调用,所以现在我我正在处理我的通用排序和他们的排序之间的差异。和你说的一样吗?感谢您的解释和代码,这很有帮助!
    • @pheadbaq:是的,就是这样。为了获得最佳效果,只需专门化现有的 std::sort。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    相关资源
    最近更新 更多