std::cref
を使用しているときにこの問題が発生しました。最小限の例では、次のようになります。オーバーロードされた関数テンプレートのインスタンス化
template<typename Fn, typename T>
auto apply(Fn f, const T &t) -> decltype(f(t))
{
return f(t);
}
int n = 123;
apply(std::cref<int>, n); // <- compile error: can't infer type `Fn`
apply([](const int &x) { return std::cref(x); }, n); // ok
は、私が最初の例に問題がstd::cref<T>
は、2つのオーバーロードされたバージョン、1はconst T &
を受け入れ、他のstd::reference_wrapper<const T>
を受け入れるを持っているということだと思います。私の場合、特定のバージョンをインスタンス化することは可能ですか?
'適用されます(static_castを<はstd :: reference_wrapper(*)(のconst int型&)を>(&はstd :: CREF )、N);'が、ラムダが悪いのでしょうか? –
@PiotrSkotnicki 'std :: vector'を 'std :: vector >'に変換するために 'fmap(std :: cref、foos)'のような処理をしようとしていましたが、文法はより洗練されたものになります。しかし、それはおそらく不可能です! –
あなた自身の参照ラップ関数を追加し、 'fmap(mycref、foos)'を持つことができます –