簡體   English   中英

將多態函數應用於每個元組元素的結果類型

[英]Result type of applying polymorphic function to each tuple element

我正在嘗試為元組編寫轉換函數,但是我發現的所有示例都將函數應用於通過引用傳遞的元組或使用非一元函數。

但是,我希望有類似的東西

std::tuple<float, int> t(3.f, 2);
// returns std::tuple<bool, bool>:
auto r1 = transform(t, [] (auto v) { return v > decltype(v)(2); });
// returns std::tuple<float, int>:
auto r2 = transform(t, [] (auto v) { return v + decltype(v)(1); });

我得到的問題是:是否有可能確定將一元函數應用於每個元組元素的結果類型?

std::make_tuple為你做類型推斷。 您需要一個index_sequence包擴展來構建make_tuple調用:

template <typename T, typename F, std::size_t... I>
auto tmap(T&& t, F&& f, std::index_sequence<I...>) {
  return std::make_tuple(f(std::get<I>(std::forward<T>(t)))...);
}

template <typename T, typename F>
auto tmap(T&& t, F&& f) {
  return tmap(std::forward<T>(t),
              std::forward<F>(f),
              std::make_index_sequence<
                std::tuple_size<
                  typename std::decay<T>::type
                >::value>{});
}

Coliru的C ++ 11兼容演示

請注意,當f返回引用類型時,返回的元組將存儲一個值。 如果您確實想存儲引用,則需要更復雜的輔助函數:

template <typename T, typename F, std::size_t... I>
auto tmap(T&& t, F&& f, std::index_sequence<I...>) {
  return std::tuple<decltype(f(std::get<I>(std::forward<T>(t))))...>{
    f(std::get<I>(std::forward<T>(t)))...
  };
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM