1

私はテンプレートのメタプログラミングにかなり慣れていないので、いくつかの概念に取り組んできました。

template<class TAG, typename... DATATYPES>
struct Message {

    Message (typename std::enable_if<sizeof...(DATATYPES) >= 1>) {
    }

    ... (various other constructor declarations here)

    std::tuple<DATATYPES...> m_data;
};

それを読んだとき、1 つ以上の DATATYPES 引数があればデフォルトのコンストラクターが有効になると思っていましたが、それをテストした結果、コンパイル エラーが発生しました。

enable_if が何をすべきかを理解しているので、このスニペットを理解するのに役立つ助けをいただければ幸いです。

編集:これは、「この特定の効果を得るにはどうすればよいか」という問題ではないと思います。さらに、「このコードは実際に何を生成しているのか、元の作成者の意図であると私が理解したものと一致していますか?」という行に沿ってさらに詳しく説明します。

4

2 に答える 2

1

メンバー関数のシグネチャはクラス定義の一部であり、クラスがインスタンス化されるときに解決する必要があります。これは、コンパイラenable_ifも を試行し、条件が満たされていなければ、ネストされたtypeハード エラーがないことを発見することを意味します。

SFINAE を機能させるには、コンストラクターをテンプレートenable_ifにし、テンプレート パラメーターに依存させる必要があります。たとえば、@acheplers の回答を参照してください。

OP のコードが行うことは、DATATYPEパックのサイズをアサートする奇妙な方法です。これは、static_assertより明確に行われます。あるいは、作成者が SFINAE を正しく実行する方法を知らなかっただけかもしれません。

于 2014-02-24T12:12:16.143 に答える