静态断言类型A可以从类型B构造

时间:2014-04-28 21:55:37

标签: c++ boost sfinae typetraits c++-concepts

我试图做一个静态断言来检查两种类型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。

1 个答案:

答案 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