2017-06-19 14 views
1

私は多くの検索を行っていますが、多くの類似の質問がありますが、どれもこの特定の質問AFAIKを解決しません。タプル要素をタイプ別に置き換える部分的な特殊化を一致させる

タプルの型を(インデックスではなく)型で置き換えたいと思います。私はこのようなものを試しました:

template <class Tuple, class ToRemove, class ToReplace> 
struct ReplaceType { 
    using type = Tuple; 
}; 

template <class ToRemove, class ToReplace, class...Args, class...Args2> 
struct ReplaceType<std::tuple<Args..., ToRemove, Args2...>, ToRemove, ToReplace> { 
    using type = std::tuple<Args..., ToReplace, Args2...>; 

}

これは動作しませんが、なぜそれをしてはならないのか理解できません。それは...パラメータがArgsのための推論ではないことを言うとArgs2 ...しかし、私には、呼び出しサイトからそれを推測するのが自然でなければなりません:

typename ReplaceType<std::tuple<int, float, char>, float, double>>::type; 

そこからintはArgs1する必要があります...でテンプレート特殊化とchar Args2 ...

  1. これはなぜ機能しませんか?
  2. 回避策はありますか?

答えて

2

一度に1ステップ。

まず、特殊化を使用してあるタイプを別のタイプにマッピングし、他のすべてのタイプは変更しません。

template<typename T, typename ToRemove, typename ToReplace> 
struct replace_type { 

    using type=T; 
}; 

template<typename ToRemove, typename ToReplace> 
struct replace_type<ToRemove, ToRemove, ToReplace> { 

    using type=ToReplace; 
}; 

、あなたが邪魔にならないよう、タプルタイプを解凍するために特殊化を使用することを得ていると、その後、それぞれの洗濯後にそれらを再梱包:TToRemoveであれば、それだけを残して他の `ToReplace、と交換してくださいreplace_type使用して1:

template<class Tuple, typename ToRemove, typename ToReplace> 
struct replace_tuple; 

template<typename ...Args, typename ToRemove, typename ToReplace> 
struct replace_tuple<std::tuple<Args...>, ToRemove, ToReplace> { 

    using type=std::tuple<typename 
        replace_type<Args, ToRemove, ToReplace>::type 
        ...>; 
}; 

GCC 6.3.1でテスト:

replace_tuple<std::tuple<int, char, int>, char, unsigned>::type foo; 

std::tuple<int, unsigned, int> *bar=&foo; 
+0

今しようとしています。私が試したものを直接使うことができないのはなぜですか?可能であれば、それについてもいくつかの洞察を得たいと思います。とにかく、試した後、私はそれが機能するので、返信を受け入れることを嬉しく思っています –

+3

パラメータパック[パックが最後のテンプレートパラメータでない限り推論できません](https://stackoverflow.com/questions/14768951/variadic-function-template-with-pack-expansion-not-in-last-parameter )ので、あなたの 'std :: tuple 'は、最後のテンプレートパラメータではないパラメータパックを推測しようとしているので、残念なことに残骸に包まれます。 –

+1

うまく実行された作業の実装をアップアップして、*燃える残骸*に落ちます。主に*燃える残骸*のため。 –

関連する問題