3

我正在尝试做一个静态断言来检查两种类型 A 和 B;类 A 应该具有签名 A(B& b) 或 A(const B& b) 的公共构造函数。

我想要某种东西来is_constructable_from<A, B>::value评估true是否存在公共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。

4

1 回答 1

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

于 2014-04-30T13:39:25.390 回答