静态断言以检查构造函数是否显式
static assert to check if constructor is explicit
我正在使用Catch单元测试库。在我的一个测试用例中,我需要能够验证类中的特定构造函数是否保持为explicit
(换句话说,如果删除了explicit
关键字,则测试应该无法编译并显示有用的/上下文消息)。
这是我可以用static_assert
做的事情吗?如果是,正确的程序是什么?我曾想过将static_assert
与类型特征一起使用,但我看不到通过类型特征验证显式构造函数的方法。
仅供参考,我在GCC 4.9(NDK和Ubuntu)和VS 2015(Windows)上启用了C++14,以防"部分支持"在任何这些工具链/平台上都是一个问题。
如果不知道类的外观(并且没有Catch的背景),就不可能给出具体的答案,但使用std::is_convertible
的通用解决方案相当简单:
#include <type_traits>
#include <iostream>
struct Foo
{
Foo(int x) {}
};
struct Bar
{
explicit Bar(int x) {}
};
int main()
{
// The `is_convertible` trait checks for implicit convertibility
std::cout << std::is_convertible<int, Foo>::value << 'n'; // "1"
std::cout << std::is_convertible<int, Bar>::value << 'n'; // "0"
}
(现场演示)
您只需要断言结果是false
,就可以设置了。
如果您的源类型本身是一个带有转换运算符的类,那么这可能会有些复杂,尽管在这种情况下,您试图防止的事情基本上是一样的。
相关文章:
- 无论如何,我可以确定构造函数是否存在吗?
- 使用 CTRP 时,是否访问访问父构造函数 UB 中的子属性?
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- 如何检测除整数以外的任何内容是否传递给我的类构造函数?
- 你能在类和构造函数中初始化吗,这是否正确?
- 在对象构造期间,将指向尚未构造的子对象的指针传递给另一个子对象的构造函数是否危险?
- 在 constexpr 构造函数中初始化数组是否合法?
- 如果这不是类的"复制构造函数",是否可以移动对象?
- 为什么复制构造函数不需要检查输入对象是否指向自身?
- std::shared_ptr 使用别名构造函数,是否可以检索初始指针值?
- 构造函数是否有一种现代C++方法来了解其'container'类?
- 如果我也使用复制构造函数并且重载 = 运算符,我是否需要析构函数?
- 我是否需要在构造函数中显式初始化 std::unique_ptr?
- 是否可以避免在以下代码中复制/移动构造函数的需要?
- 使用 lambda 作为构造函数参数是否需要C++ 17?
- C++,是否有可能/如何定义在.h和.cpp源文件中调用函数的类构造函数
- 移动构造函数是否C++过时?
- 如何构造一个类型特征,可以判断一个类型的私有方法是否可以在另一个类型的构造函数中调用?
- 在 c++ 中将对象设置为等于同一类的构造函数是否有效?