static assert来检查构造函数是否显式

时间:2016-05-09 21:56:38

标签: c++

我正在使用Catch单元测试库。在我的一个测试用例中,我需要能够验证我的类中的特定构造函数是否为explicit(换句话说,如果删除了explicit关键字,则测试将无法使用有用的/上下文的消息)。

这是我可以用static_assert做的事吗?如果是这样,那么正确的程序是什么?我已经考虑过将static_assert用于类型特征之类的东西,但是我没有看到通过类型特征来验证显式构造函数的方法。

仅供参考,我在GCC 4.9(NDK& Ubuntu)和VS 2015(Windows)上启用了C ++ 14,以防“部分支持”在任何这些工具链/平台上出现问题。

1 个答案:

答案 0 :(得分:9)

不知道你的班级是什么样的(并且在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"
}

live demo

你只需要声明结果是false,然后就可以了。

如果您的源类型本身是一个带有转换运算符的类,这可能会有些复杂,尽管您尝试阻止的事情在这种情况下基本相同。