7
私は、データ型が生ポインタまたはstd :: unique_ptrのいずれかであるstd :: mapを受け入れるテンプレートクラスを持っています。生のポインタ型にマップを使用してクラスをインスタンス化する際に、私は次のエラーを取得するしかしテンプレートメタプログラミング評価
typedef typename boost::mpl::if_<
boost::is_pointer<typename Container::mapped_type>,
typename Container::mapped_type,
typename Container::mapped_type::element_type*
>::type data_type
:次に、このクラスでは、私は基本的なポインタの型を取得したいと思い
error: 'std::map<int, ValueType*>::mapped_type {aka ValueType*}' is not a class, struct, or union type
それは、生ポインタ上でtypename Container::mapped_type::element_type*
を評価しているように思えますが、テンプレートのメタプログラミングでは、if_が成功したときにそれを評価しないと思っていました。私はこれとは別の方法で行くべきですか?あなたが怠惰なif
–が必要
ありがとうございます!それはうまくいけば怠け者を使ってもうまくいきましたが、私は本当にIDが必要な理由を理解していませんとextract_element_type ? –
grivescorbett
@grivescorbett:直接 'if_'のような型ではなく、' eval_if'は_produce_型の単項メタ関数をとります。このメタ関数の怠惰な評価/インスタンス化は、あなたが必要とするように動作させるものです。 – ildjarn
ああ、MPLを使ったのはこれが初めてのことです。 – grivescorbett