私はC++11の新機能を試しています。私のセットアップでは、継承コンストラクターを使用したいのですが、残念ながら、まだそれらを実装しているコンパイラーはありません。したがって、私は同じ動作をシミュレートしようとしています。私はこのようなものを書くことができます:
template <class T>
class Wrapper : public T {
public:
template <typename... As>
Wrapper(As && ... as) : T { std::forward<As>(as)... } { }
// ... nice additions to T ...
};
これは機能します...ほとんどの場合。クラスを使用するコードは、Wrapper
SFINAEを使用して、そのようなコードをWrapper<T>
構築する方法を検出する必要がある場合があります。ただし、次の問題があります。オーバーロードの解決に関する限り、のコンストラクターはWrapper<T>
すべての引数を受け入れますが、それらを使用して型を構築できない場合、コンパイルは失敗します(これはSFINAEではカバーされません)。T
コンストラクターテンプレートのさまざまなインスタンス化を条件付きで有効にしようとしていましたenable_if
template <typename... As, typename std::enable_if<std::is_constructible<T, As && ...>::value, int>::type = 0>
Wrapper(As && ... as) // ...
次の場合に限り、正常に機能します。
- の適切なコンストラクタ
T
はpublic
T
抽象的ではありません
私の質問は、上記の2つの制約を取り除く方法です。
式が内で整形sizeof()
式であるかどうかを(SFINAEとを使用して)チェックすることにより、最初の問題を克服しようとしました。ただし、これはもちろん機能しません。派生クラスがそのベースの保護されたコンストラクターを使用できる唯一の方法は、メンバーの初期化リストにあるためです。new T(std::declval<As &&>()...)
Wrapper<T>
2つ目については、まったくわかりません。これは、Wrapper
の抽象関数を実装しT
て完全な型にすることがあるため、さらに必要なものです。
私は次のような解決策が必要です:
- 標準に従って正しい
- gcc-4.6。*、gcc-4.7。*、またはclang-3。*のいずれかで動作します
ありがとう!