我正在尝试做一个静态断言来检查两种类型 A 和 B; A 类应具有签名 A(B& b) 或 A(const B& b) 的公共(public)构造函数。
我想要一些类似 is_constructable_from<A, B>::value
的东西计算结果为 true
如果存在公共(public) A(B& b) 或 A(const B& b) 或 A(B b)。
我想这与 boost is_convertible type_trait 有点不同.
我如何实现这一目标?
我是否错过了在 Boost Type Traits 或 Concept Check 库中执行此操作的内容?
现在我需要这个来静态检查表达式 A a(b)
是一个有效的概念,正如 Sehe 所建议的那样,它比以前的概念限制性更小。欢迎为这两种情况提供解决方案。我可以使用 Boost。
最佳答案
构造函数不是成员函数 - 它们没有您可以获取的地址,因此无法使用 SFINAE* 直接测试它们的存在。
虽然它不是完全您所要求的,但使用 C++11 您可以接近 std::is_constructible , 对于 C++03,您必须推出自己的:
template<class A, class B = void>
struct is_constructible;
template<class A, class B>
struct is_constructible {
template<class U> static U declval();
template<std::size_t N> struct dummy;
template<class U> static char test(dummy<sizeof(U(declval<B>()))>*);
template<class U> static long test(...);
static const bool value = sizeof(test<A>(0)) == sizeof(char);
};
<子>
* 以下是一个有趣的尝试,但据我所知,它在不同编译器中的表现不佳:
Check at compile time class constructor signature
关于c++ - 静态断言类型 A 可以从类型 B 构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23351840/