• 全部
  • 问答

Schlemiel's "学C++就该刨根问底",刨得起吗?

John_Cash 2003-04-18 09:15:36
声明一下:不针对个人,只针对其观点。
-----------------
我觉得这个观点太极端了,有误导倾向。
1. 谁在刨根问底?
Schlemiel文中提到的---Type Traits、通用智能指针和Enhanced Binder,typelists、policy-based design、compile-time programming。的确是比较高级的C++技术,但是首先如果它标准化的化,大家就只是在学习,而不是刨根问底了,不能因为捧着一本Standard Liberary 就认为这是在刨根问底。

其次,typelists等还没有标准化的东西,如果没有一些牛人如 Sutter, Andrei等,我们想的到吗?毫无疑问,想不到。就拿Andrei的Loki及实现Loki的技术来说,连Bjarne都承认Loki设计的太聪明了,当初估计也没有人理解/敢于把这个概念向C++社群介绍,Andrei才搬动大牛John Vlissides合作在 C++ Report, March and June 2000写了两期专栏To Code or Not to Code I&II。然后才有了Andrei的Generic<Programming>专栏。 没有Tom Cargill当年Exception Handling: A False Sense of Security的,Excetion 会被C++支持/被我们理解到什么程度?但是,这是我们这些普通程序员力所能及吗?这是我们刨根刨出来的吗?不可否认Expert就是Expert,他们完成革新,然后传播之,我们能赶上就不错了。

再说,我们看到的都是已经成型的技术,试问你知道有多少创新的思想没有实现/失败了?你有勇气自己去写一部分标准库来和当前的标准库比比性能/优雅程度吗,比如Andrei的YASLI。

2. 刨根问底的必要性

得承认,我们大多只是在高度项目进度压力下的为生计努力的普通程序员。所以我觉得把"刨根问底"的工作交给Language Lawyers们去完成,我们关心的是如何用已有的技术来将项目构建出来/必要时得学习提高一下(但绝对到不了发现新技术、新概念,然后向std建议修改语言的地步)。
所以,不刨根问底并不意味着裹足不前,反过来想想,你在一个地方刨的太久,会不会漏掉其他可供学习的技术呢?我现在就感觉接触CORBA有点晚。我估计,这方面,大家多少都有些遗憾的。

3. 写了1. 2. 我就想说3了:)
这是从 gamedev.net 上看的一句话,翻译过来就是:别把知识当智慧,前者使你能够谋生,后者使你享受生活。

4. 一个刨根问底式的测试---auto_ptr , 你懂了多少?
别以为我是一个不喜欢刨根问底的家伙,前一阵子看CORBA不知道怎么就转到auto_ptr的实现上去了,这才知道有些东西还是不要掀开盖子看为好;),不然就有点智商不够的恐怖感觉。
我的问题是:
auto_ptr实现中 那个struct auto_ptr_ref是干嘛用的?

建议:a)ACCU的chairman Francis 都认为这个问题过于微妙,在comp.lang.c++.moderate上建议大家用就行了,不要挖的太深。
b) comp.lang.c++.moderate上有很多相关讨论。
c) Scotte Meyers的More Effective C++ 支持网站上有该问题的一份完整讨论(别看书,书上的内容早都过时了)。
d)不懂就不懂,很多人都不懂,没什么大不了的,Hurb Sutter在新闻组上的一篇回帖中就说他也不太懂(主要是两次转型标准不允许的问题),不信可以去google的新闻组里搜一搜。

5. 我们要高过谁?
Schlemiel 提到“为今天致用而学习,永远没有出头之日;为探索技术而学习,才可能快人一步,高人一筹。”
想问一句,我们要高过谁?我们是在探索or还是在摸索别人5年+ 前已经提出的技术?

6. 写的比较乱,望各位高手指教。
请勿针对个人,针对观点即可。







...全文
8 点赞 收藏 17
写回复
17 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
myan 2003-04-18
其实我倒不是一个刨根问底的人。我研究一个东西之前目标总是很明确,而且非常实用化和庸俗化。一旦目标达到,则中间的那些细节都不会太在意。这一点需要大家帮助我好好弥补噢 :-) 大家共同努力,各自发挥长处,就能作出了不起的事业。我工作以后真是深刻体会到,人的精力太有限了,而且每个人的特长都不一样,重要的不在于面面俱到,也更不是要彼此互相攻击,而是要团结起来,取彼之长,补己之短,一起做出成果。

这是题外话了。
回复
学习
回复
John_Cash 2003-04-18
上面
http://expert.csdn.net/Expert/topic/1164/1164249.xml?temp=.2167627 中得分的帖子提到“为了参数匹配通过auto_ptr_ref进行了两次类型转换”只是一种方便的说法,并不正确,标准是不允许两次user defined conversion的。IMHO,应当是,一次转换,一次构造,没有copy。

http://expert.csdn.net/Expert/topic/1351/1351230.xml?temp=.8597071
这里大家通常这里只是说,编译器做了什么,而不去问编译器怎么知道要这么做:).


回复
J2eeLearner 2003-04-18
auto_ptr
http://expert.csdn.net/Expert/topic/1351/1351230.xml?temp=.8597071
http://expert.csdn.net/Expert/topic/1164/1164249.xml?temp=.2167627

:)

原来myan当时也没太在意啊!~ 呵呵~~ 那一段,我刚看的时候,怎么看怎么都觉得“有错误”! 现在已经很清楚了 :)
回复
John_Cash 2003-04-18
呵呵,myan() 说话了,myan可以证明我是个刨根问底的人:i'm the one who pointed out Wendy is not Guru in<<与大虾对话:领悟设计模式>> , remember me:).

关于auto_ptr,我在comp.lang.c++上看了不少帖子,过阵子,把看懂的贴上来,让大家一同痛苦痛苦:)

回复
daguisqh 2003-04-18
怎么这么多东西都没见过,也没听过!!!
我是大二的,现在很迷惑,不知道该怎么学,建立怎样的知识体系???!!
都说程序=算法+数据结构,是不是应该把精力都放在上边?应该看哪些书?
还有,数学应该还要学哪些,最近感觉很多程序不用数学方法,运行时间好象就上不来,但又不知道上哪找
请各位前辈门指点!!!
困惑中……
回复
cenlmmx 2003-04-18
首先一点, 我们绝大部分只是工程师,而不是研究人员,是要用技术构造产品.
所以不能刨根问底太深. 关键的是我们怎么熟练运用手中的技术.
因为我们处在一个大规模生产化的社会.社会需要的是大量的熟练工人,而不是大量的研究员.
问题就这么简单.
回复
myan 2003-04-18
1. 经常去看newsgroup是个好习惯 :-)
2. Auto_ptr中的确有些微妙的东西。我在翻译《C++标准程序库》的时候企图弄清楚,后来发现这需要去细嚼标准中有关类型转换的部分。而这个部分连Stan Lippman都承认是C++里最复杂的部分。我不得不承认没有足够的时间和精力来掌握这个东西,更何况Nicolai Josuttis说:“这个东西除了用在这里,在别的地方几乎没有任何用处。”所以就算了。Herb Sutter不了解也是正常的,他不是标准库小组的成员。
3. 我赞成技术探索,赞成刨根问题的学习精神,但是不赞成盲目的埋头苦干。我仍然认为,在下定决心学习一个技术之前,你应该尽可能了解更多的相关信息,做好选择。当然限于你的见识、世界的变化无常,你的选择可能错了,那些不问青红皂白去蛮干的人可能对了。但这是两回事,并不能够证明他比你高明或者品格更高尚。
4. C++目前的发展方向究竟怎么样,恐怕需要过几年才能看得比较清楚。我现在很关注的问题是,C#.NET是否会加入genericity,以什么形式加入?C++是否会改革Template语法,更直白地描述新的模板技术?这些问题见了分晓之后,今天的争论才可能有一个初步结论。
回复
amstrongest 2003-04-18
to huxw():

据我知道的是我们国家对于中间件项目一共就在东南大学和国防科大立了项目,科大的已经出来了产品,但是好象在兼容和使用性上都里商业开发有很大的距离,所以也就一直没有推广开,至于说东南好象是连产品都没有,就是培养了几个博士而已。
回复
diabloqin 2003-04-18
up
回复
fayekiss 2003-04-18
吓死了,吓死了,本想学学C++,呼!!!!还是学JAVA学VB吧,呼!!!!吓死了。
回复
huxw 2003-04-18
附:我讨厌把书炒的那么贵的人,并不能因为冠冕堂皇就不说他贪得无厌。至于在论坛上寻求盗版的,就连点评都可以忽略了。
回复
huxw 2003-04-18
用文言写小说和用白话写小说就是不一样;用英文写小说和用中文写小说也就是不一样。偏偏有的人坚持文言和白话都能用来纪事,英文和中文都能用来灌水,就足以证明语言是次要的。

说到中间件,怎么就没见过牌子响亮的国产中间件?

无非是偏激嘛,我也会阿。auto_ptr什么时候竟然成了一个难点,学过电子的人知道什么是与非门很了不起嘛?
回复
bullet2003 2003-04-18
up
回复
amstrongest 2003-04-18
人的精力和时间都是有限度的,C++该如何学,看个人的选择。

掌握着真正意义的技术,能真正称的上在我们国家的大师级人物是可以把C++玩的象Schlemiel(维特根斯坦的扇子) ,侯SIR这样的大侠游刃有余的?我唯一认识了解了一些的是陈火旺老师和他们手下的一批在为我们国家中间件国产化而努力的高手。在他们眼里语言根本就称不上技术,只是工具,就象写文章一样。他们把自己的时间和精力都花在了如何解决分布式环境下负载平衡的问题,如何高效的和跨平台实现进程通信的问题,如何在虚拟机环境下实现跨平台的运行时环境,如何高效实现CORBA和COM的本地组件和分布式组件通信的问题....

一个即将毕业的师兄前天临走赠言:“多学点行业知识,一定要把自己定位准确,光会编程等于你什么都不会。找工作最重要的是行业知识和基础。”

再回到我开始说起的陈火旺老师,相信大家都应该知道他的贡献,和自己弟子一起独立开发出了银河系列机的操作系统,他们的成功保证是什么?是因为他们各个都能玩C++/STL/LOKI吗?不是说C++最适合低层开发吗?那是不是精通了C++就会低层开发了?他们成功的保证是他们对行业知识的扎实掌握,和具有独创的思想,这个时候在他们工作的时候花时间不是去考虑什么语言,而是去考虑如何设计,设计过程中的缺陷是什么,如何去克服...

其实道理已经简单得不能再简单了,GRE过了2300分的就真的能写出出色的英文文章吗?就象C++高手就一定能用C++做出出色的工作吗?这样的问题是一样的道理和一样的回答,写文章和开发都是思想设计是核心,“ROSE我爱你,请你象我保证无论如何,你都不要放弃,你要活着,答应我!”这样的句子用英文可以有很多表示,那我们为什么感动与这样的句子是他们的表示方式?还是他所代表的意思和思想?
回复
J2eeLearner 2003-04-18
to John_Cash :

其实你可以在auto_ptr_ref 等相关 函数里面 ,"cout<<"
这样 就可以跟踪到 程序的 确切流程了

/// code ////

#include <iostream>
using namespace std;

template<typename _Tp1>
struct auto_ptr_ref
{
_Tp1* _M_ptr;

explicit
auto_ptr_ref(_Tp1* __p)
: _M_ptr(__p) {
cout<<" auto_ptr_ref(_Tp1* __p)"<<endl;
}
};

template<typename _Tp>
class auto_ptr
{
private:
_Tp* _M_ptr;

public:
typedef _Tp element_type;

explicit auto_ptr(element_type* __p = 0) throw()
: _M_ptr(__p) {
cout<<"auto_ptr(element_type* __p = 0)"<<endl;
}

auto_ptr(auto_ptr& __a) throw()
: _M_ptr(__a.release()) {
cout<<"auto_ptr(auto_ptr& __a)"<<endl;
}

template<typename _Tp1>
auto_ptr(auto_ptr<_Tp1>& __a) throw()
: _M_ptr(__a.release()) {
cout<<" auto_ptr(auto_ptr<_Tp1>& __a)"<<endl;
}

auto_ptr& operator=(auto_ptr& __a) throw()
{
cout<<"auto_ptr& operator=(auto_ptr& __a)"<<endl;
reset(__a.release());
return *this;
}

template <typename _Tp1>
auto_ptr& operator=(auto_ptr<_Tp1>& __a) throw()
{
cout<<"auto_ptr& operator=(auto_ptr<_Tp1>& __a)"<<endl;
reset(__a.release());
return *this;
}

~auto_ptr() {
cout<<"~auto_ptr()"<<endl;
delete _M_ptr; }

element_type& operator*() const throw() { return *_M_ptr; }

element_type* operator->() const throw() { return _M_ptr; }

element_type* get() const throw() {
cout<<"get()"<<endl;
return _M_ptr; }

element_type* release() throw()
{
cout<<"release() "<<endl;
element_type* __tmp = _M_ptr;
_M_ptr = 0;
return __tmp;
}

void reset(element_type* __p = 0) throw()
{
cout<<"reset(element_type* __p = 0)"<<endl;
if (__p != _M_ptr)
{
delete _M_ptr;
_M_ptr = __p;
}
}

auto_ptr(auto_ptr_ref<element_type> __ref) throw()
: _M_ptr(__ref._M_ptr) {
cout<<"auto_ptr(auto_ptr_ref<element_type> __ref)"<<endl;
}

auto_ptr& operator=(auto_ptr_ref<element_type> __ref) throw()
{
cout<<"operator=(auto_ptr_ref<element_type> __ref)"<<endl;
if (__ref._M_ptr != this->get())
{
delete _M_ptr;
_M_ptr = __ref._M_ptr;
}
return *this;
}

template<typename _Tp1>
operator auto_ptr_ref<_Tp1>() throw()
{
cout<<"operator auto_ptr_ref<_Tp1>()"<<endl;
return auto_ptr_ref<_Tp1>(this->release()); }

template<typename _Tp1>
operator auto_ptr<_Tp1>() throw()
{
cout<<"operator auto_ptr<_Tp1>() "<<endl;
return auto_ptr<_Tp1>(this->release()); }

};


class Helper{
public:
void say ()
{
cout<<"hello"<<endl;
}
};

int main()
{

{
auto_ptr<Helper> p4(auto_ptr<Helper>(new Helper)); // Here

(*p4).say();
}
cin.get();

}
回复
lidiya 2003-04-18
刨根问底后,回来再看那些我们认为很困难的知识
会感觉那些知识原来很简单,这就叫深入浅出吧
当然刨的要适当。
本来学的是高级语言,却要刨到二极管怎么做加法
那显然会很痛苦。
其实刨到《C++对象模型》就已经是底了。
回复
相关推荐
发帖
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2003-04-18 09:15
社区公告
暂无公告