将多态函数应用于每个元组元素的结果类型

 英萍维玟9856 发布于 2023-02-06 15:54

我正在尝试为元组编写转换函数,但是我发现的所有示例都将函数应用于通过引用传递的元组或使用非一元函数.

但是,我希望有类似的东西

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

我得到的问题是:是否有可能确定将一元函数应用于每个元组元素的结果类型?

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)))...
      };
    }
    

    2023-02-06 15:55 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有