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

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

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

相关文章:

c++ - boost::math:quadrature::sinh_sinh 中的错误?

c++ - boost::any_cast 抛出程序选项 c++

c++ - boost 正则表达式不匹配 "\\s"到空格

C++ traits类检测成员函数: compiler error in MSVC 2015 RC

c++ - 带有错误字符串的 NSIS 插件

c++ - 对 RTSP 服务器进行编程以将 RTP 发送给第三方

c++ - 如何执行 "deep"SFINAE,即当替换在代码中进一步导致一些编译错误时?

基于模板成员存在的 C++ 成员重载

c++ - 凸性缺陷 C++ OpenCv

c++ - Make 使用旧的 Makefile