【发布时间】:2014-12-13 13:21:40
【问题描述】:
在 C++ 中有没有办法编写一个可以将编译时常量作为参数的函数,但如果传递一个与运行时相关的值,则会出现编译错误?具体来说,我有一个构造函数,其中使用空指针进行初始化会有可接受的行为,但使用非空指针进行初始化意味着正在发生一些奇怪的事情。
细节,如果他们重要的话:类可以用智能指针构造,但不应该用(非空)原始指针构造。为简洁起见,我希望能够直接从空指针文字进行初始化,但智能指针不允许从原始指针进行隐式转换。这意味着在每个使用点都需要额外的措辞来将空指针显式包装在智能指针中。通过将包装移动到构造函数中来消除重复代码会很好。
我知道这样做的一种方法是使用运行时检查传递的参数是否为非空,但如果可能的话,我更希望在编译时捕获一般的原始指针转换,并且仅在原始指针绝对为空时才允许编译。
(如果您的技术依赖于 C++11 或 C++14 功能,请务必提及。)
【问题讨论】:
-
拥有一个不采用 any 指针并将其视为空智能指针的默认构造函数不是更容易吗? IE。两个构造函数,一个接受智能指针,一个接受 nothing ?为什么要让调用者有责任传递 NULL 而不是什么都不传递。
-
您可以考虑使用运行时检查,将其限制为调试构建类型。如果你想坚持编译时检查,你也可以考虑
static_assert。
标签: c++ constructor null-pointer