考慮
template <typename S, typename T, typename F>
vector<T> map(const vector<S> &ss, F f){
vector<T> ts;
ts.reserve(ss.size());
std::transform(ss.begin(), ss.end(), std::back_inserter(ts), f);
return ts;
}
int main(){
vector<int> is = {...};
vector<double> ts = map(is, [](int i){return 1.2*i;});
}
因為編譯器“無法推斷出模板引數 T”。指定map型別
template <typename S, typename T>
vector<T> map(const vector<S> &ss, std::function<T(S)> f)
也不起作用,因為它與 lambdas 不匹配。
正確的方法是什么?
uj5u.com熱心網友回復:
像這樣的東西:
template <typename S, typename F>
auto map(const std::vector<S> &ss, F f) -> std::vector<std::decay_t<decltype(f(ss[0]))>>
{
std::vector<std::decay_t<decltype(f(ss[0]))>> ts;
ts.reserve(ss.size());
std::transform(ss.begin(), ss.end(), std::back_inserter(ts), std::move(f));
return ts;
}
f我選擇了尾隨回傳型別,以便能夠ss在decltype. 您可以只使用auto回傳型別,但顯式指定型別會使函式 SFINAE 友好。
或者,具有最熱門 C 20 功能的稍微過度設計的版本:
template <
template <typename...> typename C = std::vector,
typename S, typename F
>
[[nodiscard]] C<std::decay_t<std::indirect_result_t<F, std::ranges::iterator_t<S>>>>
map(S &&ss, F f)
{
C<std::decay_t<std::indirect_result_t<F, std::ranges::iterator_t<S>>>> ts;
ts.reserve(std::ranges::size(ss));
std::ranges::transform(ss, std::back_inserter(ts), std::move(f));
return ts;
}
uj5u.com熱心網友回復:
這行得通
std::vector<double> ts = map<int, double>(is, [](int i) {return 1.2 * i; });
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/486483.html
上一篇:為什么在別名宣告中派生模板引數的類模板的無效替換不會導致錯誤
下一篇:為什么“size_of_array”模板函式不適用于inta[n](大小在運行時定義),而它適用于inta[4]?[復制]
