【问题标题】:Lots of functions vs Lots of Lambdas?大量函数 vs 大量 Lambda?
【发布时间】:2011-01-08 13:57:14
【问题描述】:

在此之前我已经发布了一些关于在快速代表上使用std::function 的问题,以及将std::function 存储在集合中以展示可以添加和删除到。在编写大量 EventArg 类型的小类时,我还询问了最佳实践,而这个小小的设计决定也已搁置。这是一个很棒的社区!

现在,撇开序言不谈,我的结构必须到位,是时候编写所有处理传入数据的处理程序了。我有一个std::map,看起来像这样:

typedef std::function<void(const CommandData&)> CommandDelegate;
typedef boost::shared_ptr<CommandDelegate> CommandDelegatePtr;
typedef std::map<short, CommandDelegatePtr> CommandMap;

我希望为此添加大约 200 个处理程序。我可以在标准成员函数和 lambdas 之间进行选择。

在考虑成员函数时,我首先想到的是 200 个声明和 200 个实现以及一个大源文件。

与其用所有这些处理程序污染我的类,我想“好吧,它们只是句柄,为什么不使用 lambdas?看起来很简单,当类被构造时,它可以将所有这些匿名函数分配给映射。作业完成!

然后我意识到构造函数会很大。我可以调用一个“initializeMap”辅助函数,由于它的大小,可以想象它可以放入它自己的文件中。

你们怎么看?

  1. .h 文件中的 200 个声明,.cpp 文件中的 200 个实现(以及其他函数)
  2. .h 文件中的 200 个声明,一个单独的“handlers.cpp”实现文件
  3. 没有声明,在 ctor 中分​​配了 200 个 lambda
  4. 没有声明,在它自己的文件中的 initializeMap 函数中分配了 200 个 lambda。

提前致谢!

【问题讨论】:

    标签: lambda delegates c++11 header-files anonymous-function


    【解决方案1】:

    我的意见是,尽可能使用 lambda。它们更易于维护。例如,如果您有一个成员函数,则每次更改它时都必须更新声明和定义,并且还必须为其分配一个唯一名称。 Lambda 是更好的选择。如果我可以对成员变量进行自动类型推导,我永远不会使用成员函数。

    【讨论】:

    • 我有点倾向于 lambda。我喜欢我的主类不会有一堆小处理程序的想法。所以我想问题是,分配它们 - 因此是关于类构造函数/初始化函数的问题。
    • 3 或 4,其实没关系,虽然我个人的偏好是源文件多而不是少,因为现代编译器可以同时编译。
    • 我非常同意,但想确认一下。感谢您的回复。
    【解决方案2】:

    您真的需要这些函数是动态的吗?因为如果你唯一关心的是不污染你的主类,有更好(更快)的解决方案,比如创建一个子类,或者只是将所有代码分成多个文件。

    如果您的标头包含 200 个函数,但从不更改,它不会使您的项目变得如此臃肿,因为它只会躺在那里。另一方面,臃肿的构造函数更糟糕,因为您很有可能不得不在某个时候更改它,然后它必须重新编译所有这 200 次初始化。

    反正编译时间可能不会那么长,但是为什么要麻烦呢?

    我只会在您的主类或其他一些专用类或文件中使用声明来保留它们的功能,但不会在 ctor 中动态初始化它们。

    【讨论】:

    • 不确定你所说的“动态”是什么意思...数据是通过代码传入的,并且必须调用该代码的适当处理程序,因此映射带有 std::function。如果这不是您所说的动态,您的意思是什么?
    猜你喜欢
    • 2020-07-07
    • 1970-01-01
    • 2017-03-27
    • 2021-10-07
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 2011-06-06
    相关资源
    最近更新 更多