问题标签 [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.
c++ - 自由函数的部分模板特化——最佳实践
正如大多数 C++ 程序员应该知道的那样,自由函数的部分模板特化是不允许的。例如,以下是非法的 C++:
然而,类/结构的部分模板特化是允许的,并且可以被用来模仿自由函数的部分模板特化的功能。例如,上一个示例中的目标可以通过使用来实现:
它更笨重,更不简洁,但它完成了工作——就用户mul
而言,他们获得了所需的部分专业化。
我的问题是:在编写模板化的自由函数(旨在供其他人使用)时,您是否应该自动将实现委托给类的静态方法函数,以便您的库的用户可以随意实现部分特化,或者做您只是以正常方式编写模板化函数,并且忍受人们无法专门化它们的事实吗?
c++ - 使用 Doxygen 在 C++ 中记录函数
我有一个项目,我正在使用 Doxygen 为其生成文档。类的文档很好,但我也有一些用于创建对象等的非成员函数。我也希望将这些记录在案,但无论我尝试什么,Doxygen 都不会生成文档我放在函数上方的评论。为什么 Doxygen 不会为全局命名空间中的函数生成文档,我需要做什么才能让它工作?
c++ - C++ 赋值运算符可以是自由函数吗?
我正在尝试这样的事情:
但我收到了这个错误:
哪些运算符可以/不能定义为自由函数是否有限制,如果有,为什么?
c++ - 私人会员和免费功能的 Doxygen 评论?
我应该为私人成员和免费功能使用 Doxygen 评论吗?我来自 Java 世界,我从未为私人成员添加 Javadoc。这是 C++ 世界中可接受的做法吗?
c++ - 运算符重载:成员函数与非成员函数?
我读到声明为成员函数的重载运算符是不对称的,因为它只能有一个参数,而自动传递的另一个参数是this
指针。所以没有标准来比较它们。另一方面,声明为 a 的重载运算符friend
是对称的,因为我们传递了两个相同类型的参数,因此可以比较它们。
我的问题是,当我仍然可以将指针的左值与引用进行比较时,为什么首选朋友?(使用非对称版本的结果与对称版本相同) 为什么 STL 算法只使用对称版本?
c++ - 静态成员函数
在阅读了 sbi 和 Eli Bendersky 在这个问题中的答案后,我开始想知道静态成员函数的用途。
一个类的无好友函数不应该做任何静态成员函数可以做的事情吗?如果是这样,为什么/什么时候我应该更喜欢静态成员函数而不是免费的朋友?
c++ - 类模板的友元函数
我有一个类模板Foo<T>
。
我想实现一个非成员函数Bar
,它需要两个Foo
s 并返回一个Foo
. 我想Bar
成为非会员,因为调用者写Bar(f1, f2)
比f1.Bar(f2)
. 我也想Bar
成为,inline
因为计算是琐碎和频繁的。
诀窍是Bar
需要访问Foo
的私人数据。我不希望有私有数据的访问者——没有充分的理由向用户公开私有数据。所以想交Bar
个朋友Foo
。
这就是我遇到麻烦的地方。编译器抱怨:
当友元声明引用函数模板的特化时,不能使用 inline 说明符。
这个规则是由标准强加的还是特定于 MSVC++ 的?
这是我尝试过的:
创建
Bar
一个 const 公共成员函数,然后声明一个简单返回的非成员版本lhs.Bar(rhs)
。这似乎是最简单的解决方案。删除
inline
提示,知道编译器将决定内联而不管提示。这会违反单一定义规则吗?它仍然必须在头文件中定义,因为它是一个函数模板。使用虚拟模板类型声明成员函数:
/li>
我不完全确定为什么会这样,但它确实满足了编译器。
有更好的解决方案吗?
c++ - 使用非成员函数重载运算符
这个问题的答案似乎让我无法理解,但是您如何使用非成员函数进行重载。您是否只是创建一个程序级函数,并且无论原型(或定义)存在于何处,该类类型的运算符都被重载了吗?
c++ - 如何调用在方法中接收对象的非成员函数
假设我有一个 Student 类,并且我已经声明了一个名为“function_A”的非成员函数,该函数将其作为参数,输入 Student。
现在说在 Student 类内部,我有一个成员函数,在其中,我想引用之前声明的非成员函数“function_A”。我将作为参数传入什么(参数本身必须是 Student 类型)。
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::copy
fromalgorithm
。例如vector
,类没有sort
函数,并且使用 stlsort
函数,因此它不是向量类的成员。但是也可以将相同的推理扩展到向量类中的其他一些函数,例如,assign
它也不能作为成员实现,而是作为便利函数实现。然而,这也会改变对象的内部状态,比如它所操作的排序。那么这个微妙但重要(我猜)的问题背后的基本原理是什么。
如果您可以访问这本书,您能否为我进一步澄清这些观点?