当前位置: 首页 > 知识库问答 >
问题:

获取std::multiply和std::plus的中性元素

司空叶五
2023-03-14

在实现构造函数采用以下构造函数的模板类时:

  1. 函数向量(函数的类型为std::function )
  2. std::binary_function ,我将使用它将向量的应用结果从1)累加到某个值。

我希望能够使用std::plus()std::multipies()作为第二个模板参数,但问题是,根据函数的不同,我需要一个相应的中性元素(用于std accumulate init值)。对于(std::multipies),我需要true(又名1),对于(std::plus),我需要false(又名0)。我知道我可以只对模板进行专门化并解决问题,但我想知道是否有一种方法可以为内置的STL函数获得中性元素。

共有1个答案

魏煜祺
2023-03-14

如果您使用的是gcc,那么就可以使用__gnu_cxx::identity_element,它完全符合您的要求。

如果您不是,我不认为有一个通用的解决方案,就好像有,gcc就不会实现它们自己的--您可能只是重写它们的实现(正如您所期望的那样,这实际上只是两个模板专门化)。

编辑:这方面的源代码在这个文件的第78-98行。

 类似资料:
  • 并行开发挺复杂的,特别是在试图用好线程和锁的过程中。如果要用到条件变量或std-atomics(一种无锁开发方式),那就更复杂了。C++0x提供了future和promise来简化任务线程间的返回值操作;同时为启动任务线程提供了packaged_task以方便操作。其中的关键点是允许2个任务间使用无(显式)锁的方式进行值传递;标准库帮你高效的做好这些了。基本思路很简单:当一个任务需要向父线程(启动

  • 标准库函数bind()和function()定义于头文件<functional>中(该头文件还包括许多其他函数对象),用于处理函数及函数参数。bind()接受一个函数(或者函数对象,或者任何你可以通过”(…)”符号调用的事物),生成一个其有某一个或多个函数参数被“绑定”或重新组织的函数对象。(译注:顾名思义,bind()函数的意义就像它的函数名一样,是用来绑定函数调用的某些参数的。)例如: int

  • 我在理解条件变量及其在互斥体中的使用时遇到了一些困难,我希望社区能帮助我。请注意,我来自win32背景,因此与CRITICAL_SECTION、HANDLE、SetEvent、WaitForMultipleObject等一起使用。 这是我第一次尝试使用C++11标准库进行并发操作,它是在这里找到的一个程序示例的修改版本。 关于这个的几个问题。 我读过“任何要等待std::condition_var

  • 两者之间有实际区别吗 和 ? 看起来包含常量元素的非常量数组仍然无法交换,赋值运算符也不起作用<我什么时候应该选择一个而不是另一个?

  • 我需要弄清楚lock和condition_variable是如何工作的。 在这里略有修改的cplusplusreference代码中 我感到困惑的是,如果worker_thread已经锁定了互斥体,主线程如何锁定它。 我不明白为什么在这种情况下会出现“运行时错误”。

  • 要检查向量是否为空,我可以使用或。我查看了cplike上的签名,但缺乏理解它们的知识。它们如何相互关联?一个实现调用另一个实现吗? 我知道其中一个来自容器库,另一个来自迭代器库,但仅此而已。