我试图做一个静态断言来检查两种类型A和B; A类应具有签名A(B& b)或A(const B& b)的公共构造函数。
如果存在公开A(B&amp; b)或A(const B&amp; b)或A(B b),我希望有is_constructable_from<A, B>::value
某种评估为true
的内容
我想这与提升is_convertible type_trait有所不同。
我如何实现这一目标?
我是否错过了在Boost Type Traits或Concept Check库中执行此操作的内容?
现在我需要这个来进行静态检查,表达式A a(b)
是有效的,如Sehe所建议的那样,限制性比前一个概念要小。我们欢迎这两种情况的解决方案。我被允许使用Boost。
答案 0 :(得分:1)
构造函数不是成员函数 - 它们没有可以使用的地址,因此无法使用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
子>