简体   繁体   English

如何从函子的元组中返回返回值的元组?

[英]How do I return a tuple of return values from a tuple of functors?

    namespace easy_random {

    template<typename First_T>
    auto make_tuple_of_rands(First_T first) {
        return std::make_tuple(first());
    }

    template<typename First_T, typename... Rest_T>
    auto make_tuple_of_rands(First_T first, Rest_T... rest) {
        return std::tuple_cat(make_tuple_of_rands(first),make_tuple_of_rands(rest...));
    }

    template<typename First_T>
    auto make_tuple_of_n_rands(std::size_t n, First_T first) {
        return std::make_tuple(first(n));
    }

    template<typename First_T, typename... Rest_T>
    auto make_tuple_of_n_rands(std::size_t n, First_T first, Rest_T... rest) {
        return std::tuple_cat(make_tuple_of_n_rands(n, first), make_tuple_of_n_rands(n, rest...));
    }



    template<typename... RandStreamTypes>
    class multi_rand_stream {
        std::tuple<RandStreamTypes...> streams;
    public:
        explicit multi_rand_stream(RandStreamTypes... args);

        explicit multi_rand_stream(std::tuple<RandStreamTypes...> &args);

        auto operator()();

        auto operator()(std::size_t n);
    };

    template<typename... RandStreamTypes>
    multi_rand_stream<RandStreamTypes...>::multi_rand_stream(RandStreamTypes... args) : streams(args...) {}

    template<typename... RandStreamTypes>
    multi_rand_stream<RandStreamTypes...>::multi_rand_stream(std::tuple<RandStreamTypes...> &args) : streams(args) {}

    template<typename... RandStreamTypes>
    auto multi_rand_stream<RandStreamTypes...>::operator()() {
        return std::apply(make_tuple_of_rands, streams);
    }

    template<typename... RandStreamTypes>
    auto multi_rand_stream<RandStreamTypes...>::operator()(std::size_t n) {
        return std::apply(make_tuple_of_n_rands, std::tuple_cat(std::make_tuple(n), streams));
    }
}

I would like to be able to return a tuple composed of the return values from running the members of tup as functors. 我希望能够通过将tup的成员用作函子来返回由返回值组成的元组。

I'm currently at a loss as to how to approach doing so. 我目前对如何做到这一点一无所知。 I have tried using apply and recursion with tuple_cat, but it has been having trouble deducing the template typing of the functions. 我尝试将tuple_cat与apply和recursion一起使用,但是在推断函数的模板类型时遇到了麻烦。

edit: to include the full class i'm trying to implement, maybe that will expose my error. 编辑:包括我要实现的完整类,也许这将暴露我的错误。

Answer from comments above: I would simply use std::apply() to unfold the tuple into a variadic lambda. 上面评论的答案:我只是使用std::apply()将元组展开为可变的lambda。 There you can then receive the tuple elements as a parameter pack, which you can expand into an intializer list that makes a new tuple from calling each element: 然后,您可以在其中接收作为参数包的元组元素,您可以将其扩展为一个初始化器列表,该列表可通过调用每个元素来创建新的元组:

template<typename... Ts>
class multi_functor
{
    std::tuple<Ts...> tup;

public:
    auto operator()()
    {
        return std::apply([](auto&&... args)
        {
            return std::tuple { args()... };
        }, tup);
    }
};

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM