他们是否可以使用与成员函数相同的"点"表示法在对象上使用非成员非友元函数?
我可以从一个类中拉出(任何)成员,并让用户以他们一直使用的方式使用它吗?
更长的解释:
Scott Meyers,Herb Sutter等人认为,非成员非朋友函数是对象接口的一部分,可以改进封装.我同意他们.
但是,在最近阅读本文之后:http://www.gotw.ca/gotw/084.htm我发现自己质疑语法含义.
在这篇文章中,香草提出了具有单insert,erase和replace成员,以及多个同名的非成员非友元函数.
这是否意味着,正如我认为的那样,Herb认为某些函数应该与点符号一起使用,其他函数应该作为全局函数使用?
std::string s("foobar");
s.insert( ... ); /* One like this */
insert( s , ...); /* Others like this */
Run Code Online (Sandbox Code Playgroud)
编辑:
感谢大家提供的非常有用的答案,但是,我认为我的问题的观点被忽略了.
我特别没有提到运营商的具体情况,以及他们如何保留"自然"符号.也不应该将所有内容都包装在命名空间中.这些东西写在我链接的文章中.
问题本身是:
在文章中,Herb建议一个insert()方法是成员,而其余的是非成员非朋友函数.
这意味着要使用一种形式的insert(),你必须使用点符号,而对于其他形式,则不需要.
这只是我,还是听起来很疯狂?
我有一种预感,也许你可以使用单一语法.(我在想如何Boost :: function可以为mem_fun取一个*this参数).
您可以使用单一语法,但可能不是您喜欢的语法。您无需将 insert() 放置在类范围内,而是使其成为类的友元。现在你可以写
mystring s;
insert(s, "hello");
insert(s, other_s.begin(), other_s.end());
insert(s, 10, '.');
Run Code Online (Sandbox Code Playgroud)
对于任何非虚拟的公共方法,相当于将其定义为非成员友元函数。如果混合点/无点语法让您烦恼,那么请务必使这些方法成为友元函数。没有什么区别。
将来我们也能够编写这样的多态函数,所以也许这就是 C++ 的方式,而不是人为地尝试将自由函数强制纳入点语法中。