c++ - "most people seriously overuse casts"怎么办?

标签 c++

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

Q: What's the best way to improve my C++ programs?

A: I couldn't say. That depends on how you use it. Most people underestimate abstract classes and templates. Conversely, most people seriously overuse casts and macros.

我以前见过关于宏的观点,但是当“大多数人”可以做其他事情时,他们会用强制类型转换做什么呢?我正在考虑指针转换。

最佳答案

what do "most people" do with casts when they could be doing something else?

您对指针强制转换的猜测听起来是正确的。

考虑这段代码:

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 版本有很多问题,一点都不好笑)。

关于c++ - "most people seriously overuse casts"怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20428538/

相关文章:

c++ - 如何创建自定义操作来更改文件权限

c++ - 如何使用 C++ 以编程方式终止进程?

c++ - 每秒获取传感器的值 C++

C++:从 *std::shared_ptr 复制时出错

c++ - 定义全局数组的运行时间成本?

C++ 套接字无法正常工作

c++ - 为什么有些人使用交换进行 move 分配?

c++ - 关于抽象工厂和注入(inject)的问题

c++ - 如何使用命令行参数创建一个新进程并将 PID 提供给父进程?

c++ - 在哪里可以在 Windows 上设置 make.exe 的路径?