私が達成したいのは、3つの引数、1組の反復子、および値を変換する関数を受け入れるmakeSet()関数です。 std::map<K,V>
std::set<std::pair<V,K>>.
関数テンプレートにlambdaを使用し、型を推定できません。makeSet()ユースケース
に、クライアントコードは、私の現在の試みとしてある
auto s = makeSet(hash.begin(), hash.end(),
[](std::pair<int,int> x) { return std::make_pair(x.second, x.first); });
のように見えるかもしれ
つのユースケースは、値のシーケンスからセットを作成することができ、変換は、例えば、変換しません続く、
// (commented code are some other *failed* attempt).
template <typename Iterator,
typename T = typename std::iterator_traits<Iterator>::value_type,
template<typename ... > class Monad, typename R >
// typename R, typename Monad = std::function<R(T)> >
std::set<R> makeSet(Iterator first, Iterator last, Monad<R,T> f) {
std::set<R> res;
for (; first != last; ++first) res.insert(f(*first));
return res;
}
しかし、残念ながら動作しません。問題はRを推測できないようです。
解決策はありますか? 私はそれを行う正しい方法を教えていただければ幸いです。
ああ、いつも好きな宣言型! – qeatzy
範囲は、[this](https://ericniebler.github.io/std/wg21/D4128.html)と似たイテレータのペアではなく、範囲のオブジェクトを使用することを意味しますか? – qeatzy
私は単に 'std :: decay_t'を使います。 'decay_t'は型を記憶に適したものにするためです。第2のポイントは、 'std :: function'の型を決して決して決めるべきではないということです。 'std :: function'は型消去クラスであり、型減算と型消去は反対です。消去するタイプを控除することは、設計上の欠陥の兆候です。ここでは固定タイプが必要なので消去します。あなたはここで正確なタイプを知っているから推測します。あなたが正確なタイプを知っていれば、999/1000回そこに固定タイプは必要ありません。 –
Yakk