问题标签 [non-member-functions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
899 浏览

c++ - C++ 静态非成员函数返回模板类的对象

我有一个静态非成员函数,它根据对象的类型返回一个模板类对象。

这不起作用,因为返回类型 Example 是一个模板。我该如何写这个返回类型

0 投票
1 回答
130 浏览

c++ - 指定应调用非成员函数而不是成员函数

我有一个类,其中有一个名为的成员f,同时还有一个名为f. 自由函数f旨在从另一个成员调用(g在下面调用)。

事实证明,我的编译器(GCC 和 clang)无法解析对f.

这当然是因为它与 member 混淆了f。然而,只有::f有意义。

如果我要强制成员函数,我可以说this->for B::f但是我不知道可以做相反的语法,即强制自由函数::f或实际上f由 ADL 给出的一些外部分辨率并禁用成员函数(类似于notthis->f)。

我可以使用using ::f

但是,这不是通用的,因为我不知道T属于哪个命名空间并且我想要通用代码。(这里::只是 for T = A,但对于我不知道的其他命名空间中的其他类)。

例如,该类B<ns::C>应编译为:

当然,我可以重命名所有内容以避免冲突,但这不是一个可接受的解决方案,假设同时调用 free 和成员函数是有意义的f

这是 GCC 和 clang 的错误,语言的缺陷还是我错过了一些明显的方法来指定不使用成员函数?

(该示例使用 C++11,但该问题适用于任何版本的 C++)。


感谢@JohnZwinck,这是当前的解决方法

0 投票
2 回答
73 浏览

c++ - 算法在容器中找到一个元素,其成员之一具有给定值

我经常要做的事情是在元素集合中找到一个成员,该成员具有给定值的元素。例如给出:

我想找到名为“Alice”的人。一种方法是(使用升压范围适配器):

对于如此简单的操作,这是很多样板。难道不应该做类似的事情:

(无法编译,因为 &Person::getName 不是一元函数)

有没有一种简单的方法可以为成员获取一元函数?

0 投票
2 回答
833 浏览

c++ - 通过使私有方法成为自由函数来对私有方法进行单元测试

在 2017 cppcon 视频中,我看到了 Klaus Iglberger 的演讲,题目是“释放你的函数! ”。在本次演讲中,演讲者谈到了切换到自由函数如何简化私有方法的测试过程(见 19:00)。这个想法是你将私有方法从类中拉出来(你使它成为一个自由函数)并且它变得可测试。

起初,我觉得这个想法很有趣,但后来我想得越多,我就越不明白这实际上应该如何工作。例如,假设我有以下(虚拟)类:

然后someComplexTask()someOtherComplexTask()是私有方法。这意味着它们是实现细节,即它们只能在内部SomeClass(或朋友)调用。在我看来,如果你让它们成为自由函数,是的,它们变得可测试,但它们不再是私有的,也不是特定于SomeClass. 事实上,它们可以从代码中的任何地方调用......

所以我的问题是:为什么伊格尔伯格先生的观点是有效的?

0 投票
2 回答
673 浏览

c++ - 如何在 C++ 中为模板类包含非成员运算符重载?

我是 C++ 新手,模板在语法上绝对不友好。基本上,这是我编写、测试和完成的一些功能。只是一个简单的问题,我已经尝试了几个小时来为我的矩阵类编写一个非成员运算符重载并且已经得到所有类型的语法错误。那么,我从哪里开始呢?

这是我的 myMatrix.h:

这是我尝试过的一件事:

显然这不起作用..那么我应该遵循什么语法呢?此外,这可能是一个非常愚蠢的问题,但非成员函数应该在头文件还是 .cpp 文件中?到目前为止,我写的所有东西都在 .h 文件中,因为它们都是模板。

任何帮助将不胜感激。

更新:我终于让代码工作了,对于类和函数声明,我添加了这个:

这是函数定义:

完美运行,没有警告!感谢所有帮助

0 投票
0 回答
465 浏览

c++ - 自由函数与成员函数的“经验法则”

我最近考虑了一个流行的准则(Scott Meyers、Klaus Iglberger 等),它基本上更喜欢非成员(免费)函数而不是成员函数。我注意到我确实可以将我的大部分成员函数拉到外面,但我很难弄清楚什么时候我应该这样做

这是一个简单的示例,一个以某种格式化方式将字符串向量(私有数据成员)打印到控制台的函数:

我发现在这样的简单情况下很难做出决定,在我看来,在短期内成员函数会更优雅一些,而自由函数可以随着程序变大而适应多个对象。有没有人有某种经验法则来帮助决定?我只是想太多了吗?谢谢。

0 投票
0 回答
68 浏览

c++ - “释放你的功能”方法:IDE 可以提供提示吗?

我一直在听 Klaus Iglberger 在 CppCon 2017 上的演讲,名为“释放你的功能”(你可以在 Youtube 上找到它:https ://www.youtube.com/watch?v=WLDT1lDOsb4 ),它更好地揭示了一个概念背后的基本原理来自 Effective C++ 书籍指南:“Prefer non-member non-friend functions to member functions”

纵观所有的优点和缺点,有一个缺点让我非常困惑,那就是:你不使用 调用这些函数operator.,它们可以在任何地方自由定义。

阅读这篇关于接口原则的文章,其中广泛讨论了什么应该被视为类公共接口http://www.gotw.ca/publications/mill02.htm),我很清楚这些免费功能是类接口的一部分,即使它们可以在项目中任何位置的任何文件中定义。

为什么是劣势?因为根据我的经验,将代码分散在大型项目中会导致代码重复,因为开发人员无法知道已经为该类实现了某些实用程序功能,因此他们将再次对其进行编码。当您使用operator.对对象调用函数时,不会发生这种情况,不仅因为语言本身强制成员函数在声明类的同一文件中声明,而且还仅仅是因为 IDE 通常会弹出- 按下“.”时,列出已经可用的成员函数。

所以问题是:假设接口原则是正确的,假设自由函数方法是一个很好的编码指南,为了摆脱人们没有找到已经为一个类编写的自由函数的缺点,在技术上是否可行IDE 是否可以帮助开发人员展示整个类的公共接口,而不仅仅是类成员?或者在实践中它会是计算的压倒性的,甚至是无法实现的?

0 投票
1 回答
298 浏览

c++ - 将数据成员公开的辅助结构

所以我试图用辅助方法构造一个类,即:

但是helper,如果我们想测试,创建一个朋友函数会将测试与实现结合起来helper

所以我想做helper一个免费的功能,即:

然而,当数据成员很多时,这会使代码变得更加乏味。所以,我想出了一个想法来构建一个辅助结构,它具有精确的数据成员,Type但所有数据成员都是公共的,这样我们就可以简单地传递这样的句柄HelperType,也许是这样的:

有没有什么优雅的方法来构造这样的HelperType结构?例如通用包装器或可能具有继承?

0 投票
2 回答
1660 浏览

c++ - 如何在 C++ 中定义内联自由函数(非成员函数)?

在 C++ 中,我需要定义一些内联通用函数。但是,当我在头文件中编写原型并在 a.cpp 文件中编写实现时,遇到“LNK2001 未解析的外部符号”错误。

我应该删除.cpp文件并在头文件中实现该功能吗?

我正在尝试定义一些其他类可以使用的共享非成员数学函数。

头文件:

.cpp 文件

0 投票
2 回答
315 浏览

c++ - 为什么我们可以从 C++ 中的成员函数访问非成员函数

以下代码编译时没有任何警告或错误:

我不明白由于 fun 函数的范围仅在 demo_class 中,那么它如何调用 fun2 函数,它不应该显示错误作为仅在 demo_class 内访问 fun 函数吗?