3

私は静的アサーションを実行して、A と B の 2 つのタイプをチェックしようとしています。クラス A には、署名 A(B& b) または A(const B& b) のパブリック コンストラクターが必要です。

public A(B& b) または A(const B& b) または A(B b) が存在するかどうかis_constructable_from<A, B>::valueを評価するようなものが欲しいです。true

これは 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 に答える