问题标签 [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 投票
2 回答
4883 浏览

c++ - 自由函数的部分模板特化——最佳实践

正如大多数 C++ 程序员应该知道的那样,自由函数的部分模板特化是不允许的。例如,以下是非法的 C++:

然而,类/结构的部分模板特化允许的,并且可以被用来模仿自由函数的部分模板特化的功能。例如,上一个示例中的目标可以通过使用来实现:

它更笨重,更不简洁,但它完成了工作——就用户mul而言,他们获得了所需的部分专业化。


我的问题是:在编写模板化的自由函数(旨在供其他人使用)时,您是否应该自动将实现委托给类的静态方法函数,以便您的库的用户可以随意实现部分特化,或者做您只是以正常方式编写模板化函数,并且忍受人们无法专门化它们的事实吗?

0 投票
4 回答
41460 浏览

c++ - 使用 Doxygen 在 C++ 中记录函数

我有一个项目,我正在使用 Doxygen 为其生成文档。类的文档很好,但我也有一些用于创建对象等的非成员函数。我也希望将这些记录在案,但无论我尝试什么,Doxygen 都不会生成文档我放在函数上方的评论。为什么 Doxygen 不会为全局命名空间中的函数生成文档,我需要做什么才能让它工作?

0 投票
2 回答
8117 浏览

c++ - C++ 赋值运算符可以是自由函数吗?

我正在尝试这样的事情:

但我收到了这个错误:

哪些运算符可以/不能定义为自由函数是否有限制,如果有,为什么?

0 投票
3 回答
1970 浏览

c++ - 私人会员和免费功能的 Doxygen 评论?

我应该为私人成员和免费功能使用 Doxygen 评论吗?我来自 Java 世界,我从未为私人成员添加 Javadoc。这是 C++ 世界中可接受的做法吗?

0 投票
2 回答
106033 浏览

c++ - 运算符重载:成员函数与非成员函数?

我读到声明为成员函数的重载运算符是不对称的,因为它只能有一个参数,而自动传递的另一个参数是this指针。所以没有标准来比较它们。另一方面,声明为 a 的重载运算符friend对称的,因为我们传递了两个相同类型的参数,因此可以比较它们。

我的问题是,当我仍然可以将指针的左值与引用进行比较时,为什么首选朋友?(使用非对称版本的结果与对称版本相同) 为什么 STL 算法只使用对称版本?

0 投票
5 回答
13501 浏览

c++ - 静态成员函数

在阅读了 sbi 和 Eli Bendersky 在这个问题中的答案后,我开始想知道静态成员函数的用途。

一个类的无好友函数不应该做任何静态成员函数可以做的事情吗?如果是这样,为什么/什么时候我应该更喜欢静态成员函数而不是免费的朋友?

0 投票
3 回答
2681 浏览

c++ - 类模板的友元函数

我有一个类模板Foo<T>

我想实现一个非成员函数Bar,它需要两个Foos 并返回一个Foo. 我想Bar成为非会员,因为调用者写Bar(f1, f2)f1.Bar(f2). 我也想Bar成为,inline因为计算是琐碎和频繁的。

诀窍是Bar需要访问Foo的私人数据。我不希望有私有数据的访问者——没有充分的理由向用户公开私有数据。所以想交Bar个朋友Foo

这就是我遇到麻烦的地方。编译器抱怨:

当友元声明引用函数模板的特化时,不能使用 inline 说明符。

这个规则是由标准强加的还是特定于 MSVC++ 的?

这是我尝试过的:

  • 创建Bar一个 const 公共成员函数,然后声明一个简单返回的非成员版本lhs.Bar(rhs)。这似乎是最简单的解决方案。

  • 删除inline提示,知道编译器将决定内联而不管提示。这会违反单一定义规则吗?它仍然必须在头文件中定义,因为它是一个函数模板。

  • 使用虚拟模板类型声明成员函数:

    /li>

我不完全确定为什么会这样,但它确实满足了编译器。

有更好的解决方案吗?

0 投票
1 回答
1279 浏览

c++ - 使用非成员函数重载运算符

这个问题的答案似乎让我无法理解,但是您如何使用非成员函数进行重载。您是否只是创建一个程序级函数,并且无论原型(或定义)存在于何处,该类类型的运算符都被重载了吗?

0 投票
1 回答
1220 浏览

c++ - 如何调用在方法中接收对象的非成员函数

假设我有一个 Student 类,并且我已经声明了一个名为“function_A”的非成员函数,该函数将其作为参数,输入 Student。

现在说在 Student 类内部,我有一个成员函数,在其中,我想引用之前声明的非成员函数“function_A”。我将作为参数传入什么(参数本身必须是 Student 类型)。

代码

0 投票
7 回答
15735 浏览

c++ - Effective C++ Item 23 Prefer non-member non-friend functions to member functions

在对类设计的一些事实感到困惑时,特别是函数是否应该是成员,我查看了 Effective c++ 并找到了第 23 条,即 Prefer non-member non-friend functions to member functions。使用 Web 浏览器示例第一手阅读该内容是有一定道理的,但是该示例中的便利函数(在书中像这样命名非成员函数)会改变类的状态,不是吗?

  • 那么,第一个问题,他们不应该成为会员吗?

  • 进一步阅读,他考虑了 STL 函数,实际上某些类未实现的一些函数是在 stl 中实现的。按照本书的想法,它们演变成一些方便的函数,这些函数被打包到一些合理的命名空间中std::sort,例如std::copyfrom algorithm。例如vector,类没有sort函数,并且使用 stlsort函数,因此它不是向量类的成员。但是也可以将相同的推理扩展到向量类中的其他一些函数,例如,assign它也不能作为成员实现,而是作为便利函数实现。然而,这也会改变对象的内部状态,比如它所操作的排序。那么这个微妙但重要(我猜)的问题背后的基本原理是什么。

如果您可以访问这本书,您能否为我进一步澄清这些观点?