“大多数人严重过度使用演员表”如何? [复制]

Posted

技术标签:

【中文标题】“大多数人严重过度使用演员表”如何? [复制]【英文标题】:How do "most people seriously overuse casts"? [duplicate] 【发布时间】:2013-12-06 16:12:40 【问题描述】:

来自http://www.stroustrup.com/bs_faq.html#improve-my-C++-programs

问:改进我的 C++ 程序的最佳方法是什么?

A:我不能说。这取决于你如何使用它。大多数人都低估了抽象类和模板。相反,大多数人严重过度使用强制转换和宏。

我以前看到过关于宏的观点,但是当“大多数人”可以做其他事情时,他们会如何处理演员表呢?我在考虑指针转换。

【问题讨论】:

我最好的猜测是答案的两个部分齐头并进。人们在动态绑定方面低估了抽象类和模板。这会导致不必要的强制转换和宏的使用,在这种情况下,可以使用更好的 OO 设计(在这种情况下广泛使用多态性)来代替。 鉴于后面还有一个问题,“我们什么时候会有 C++ 标准?”,该文本很可能是 15 年前编写的。如果是这样,它可能没有更新(当然,许多常见问题解答最近更新了)。我真的不会担心“大多数人”做了什么。 @SteveJessop 问题,是的,但答案已更新。 【参考方案1】:

当“大多数人”可以做其他事情时,他们会如何处理演员表?

你对指针的猜测是正确的。

考虑这段代码:

class some_base  /* ... */ ;

class some_implementation: public some_base
 void do_impl_stuff()  /* ... */  ; // do_impl code is in specialization

错误的客户端代码:

void do_stuff(some_base* base)

    if(some_implementation* p = dynamic_cast<some_implementation*>(base)) 
        p->do_impl_stuff();
    

更好的选择:

class some_base

public:
    virtual void do_impl_stuff() = 0;
    virtual ~some_base() = default;
;

class some_implementation: public some_base
 virtual void do_impl_stuff() override  /* ... */  ;

void do_stuff(some_base* base)

    base->do_impl_stuff();

第一个例子“滥用”了动态演员表。第二,是“做点别的”

编辑:Xephon 提出的观点也是有效的。

关于宏的过度使用,您在 C++ 中使用宏编写的大多数代码都可以(并且通常应该)使用模板化代码编写。

例如,看看 C #define min/#define max 与 C++ std::minstd::max(C 版本有很多问题,甚至都不好笑)。

【讨论】:

Re 宏:模板化代码、常量和内联!【参考方案2】:

“大多数人”可能正在使用 C 风格的指针转换。最常见的是将指针转换为 void * 或整数。我经常这样做......

很多时候,这受到我在程序另一端的限制。就像将参数列表传递给 pthread_create 一样。

【讨论】:

想了想,还是接受了这个,因为我觉得这更接近预期的意思。

以上是关于“大多数人严重过度使用演员表”如何? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

ae里的渐变过度在哪里

UIPageViewController 滚动(过度滚动)

如何检查过度绘制

23-过犹不及:正则化方法防止过度拟合

如何让 SliverPersistentHeader “过度生长”

K-Fold 如何防止模型中的过度拟合