【问题标题】:How to pass a std-functor in c++ and use it without knowing which one it is specifically如何在 C++ 中传递一个 std-functor 并在不知道它具体是哪一个的情况下使用它
【发布时间】:2011-01-05 15:16:01
【问题描述】:

我在这里有一个类似排序算法的东西,我想给它传递一个函子,它提供了排序标准(std::binary_function)。所以它应该调用 T.operator

问题是,成员函数 operator() 不是虚拟的。所以我需要知道给出了哪种类型的对象,以执行不太好的动态转换。

问候,

丹尼斯

【问题讨论】:

    标签: c++ stl virtual std functor


    【解决方案1】:

    问题是,成员函数 operator() 不是虚拟的。所以我需要知道给出了哪种类型的对象,以执行不太好的动态转换。

    为什么要执行动态转换?通常你不需要那个。只需调用函子的operator(),就像调用普通函数一样。

    仿函数的全部意义在于它们的行为类似于普通函数,并且您将模板参数传递给您的算法(不是吗?)以处理不同的仿函数(和函数)类型。

    当然,这一切都基于您正在实际上将模板参数传递给您的函数这一事实。 std::binary_function 适合作为虚拟基类。它的存在只是为了定义一些方便的 typedef。因此,您的函数声明应如下所示:

    template <typename TBinaryFunction>
    void your_algorithm(rest of parameters …, TBinaryFunction f);
    

    【讨论】:

    • 我不想使用 dynamic_cast... 但我也不能使用 operator() 因为在本地上下文中,它是没有定义 operator() 的 binary_function。 afaik 你必须先重载它才能使用它......
    • @Dennis:那么你在滥用binary_function。正如我在回答中所说,它从来没有打算充当多态基类。它只是定义了一些有用的 typedef,仅此而已。您不能将binary_function 有意义地传递给另一个函数,这不应该工作。
    • ok thx。你能举个例子吗? (链接?)我打算将 binary_function 用作未指定的超类,以便可以使用 STL 中的每个比较函子……我不太明白如何在这里使用模板。
    • @Dennis:您必须在此处使用模板,否则无法正常工作。 parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.14 有一个名为 myCode 的示例函数,它将函子(他们称之为“functionoid”)作为模板参数。
    【解决方案2】:

    你不能将你的仿函数作为模板参数传递,以便拥有静态多态吗?

    【讨论】:

    • 可以肯定,模板的这种特殊用途不是静态多态性。
    【解决方案3】:

    你可以使用 Qt Signal and Slots 或者你可以使用 Boost.Function

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-18
      • 2020-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多