Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 融合自适应标准元组视图,转换为另一个元组_C++11_Tuples_Boost Fusion - Fatal编程技术网

C++11 融合自适应标准元组视图,转换为另一个元组

C++11 融合自适应标准元组视图,转换为另一个元组,c++11,tuples,boost-fusion,C++11,Tuples,Boost Fusion,Boost Fusion的设计方式是,大多数转换都是“惰性的”,即它们都生成“视图”,而不是实际的(Fusion)容器()。例如,要真正反转一个向量,需要使用转换函数作为_vector() 如何将结果视图转换回元组? 我希望这个?函数被称为标准元组(类似于boost::fusion::as_vector),但它并不存在 有几种反转元组的解决方案,在这种情况下,我只想使用Boost Fusion中已有的方法。我不知道有任何内置方法可以将Boost Fusion序列转换为std::tuple,但使用

Boost Fusion的设计方式是,大多数转换都是“惰性的”,即它们都生成“视图”,而不是实际的(Fusion)容器()。例如,要真正反转一个向量,需要使用转换函数
作为_vector
()

如何将结果视图转换回元组?

我希望这个
函数被称为
标准元组
(类似于
boost::fusion::as_vector
),但它并不存在


有几种反转元组的解决方案,在这种情况下,我只想使用Boost Fusion中已有的方法。

我不知道有任何内置方法可以将Boost Fusion序列转换为
std::tuple
,但使用它可以相当容易地实现:

template <std::size_t... Is>
struct indices {};

template <std::size_t N, std::size_t... Is>
struct build_indices
  : build_indices<N-1, N-1, Is...> {};

template <std::size_t... Is>
struct build_indices<0, Is...> : indices<Is...> {};

template<typename Sequence, std::size_t ...Is>
auto as_std_tuple_impl(const Sequence& s, indices<Is...>&&) -> decltype(std::tie(boost::fusion::at_c<Is>(s)...))
{
    return std::tie(boost::fusion::at_c<Is>(s)...);
}

template <typename Sequence, typename Indices = build_indices<boost::fusion::result_of::size<Sequence>::value>>
auto as_std_tuple(const Sequence& s) -> decltype(as_std_tuple_impl(s, Indices()))
{
    return as_std_tuple_impl(s, Indices());
}
输出:

(1, 2.5, hello)
(hello, 2.5, 1)

我认为
boost::fusion::copy
可能有用:(你可能也应该看看
boost::fusion::move
。@cv_和_he,谢谢你知道这一点。我想问题是,会有一个元函数几乎和函数本身一样复杂,它计算反转元组的类型。
template <std::size_t... Is>
struct indices {};

template <std::size_t N, std::size_t... Is>
struct build_indices
  : build_indices<N-1, N-1, Is...> {};

template <std::size_t... Is>
struct build_indices<0, Is...> : indices<Is...> {};

template<typename Sequence, std::size_t ...Is>
auto as_std_tuple_impl(const Sequence& s, indices<Is...>&&) -> decltype(std::tie(boost::fusion::at_c<Is>(s)...))
{
    return std::tie(boost::fusion::at_c<Is>(s)...);
}

template <typename Sequence, typename Indices = build_indices<boost::fusion::result_of::size<Sequence>::value>>
auto as_std_tuple(const Sequence& s) -> decltype(as_std_tuple_impl(s, Indices()))
{
    return as_std_tuple_impl(s, Indices());
}
#include <tuple>
#include <utility>

#include<boost/fusion/adapted/std_tuple.hpp>
#include <boost/fusion/algorithm/transformation/reverse.hpp>
#include <boost/fusion/include/reverse.hpp>

#include <boost/fusion/sequence/intrinsic/size.hpp>
#include <boost/fusion/include/size.hpp>

#include <iostream>

template <std::size_t... Is>
struct indices {};

template <std::size_t N, std::size_t... Is>
struct build_indices
  : build_indices<N-1, N-1, Is...> {};

template <std::size_t... Is>
struct build_indices<0, Is...> : indices<Is...> {};

template<typename Sequence, std::size_t ...Is>
auto as_std_tuple_impl(const Sequence& s, indices<Is...>&&) -> decltype(std::tie(boost::fusion::at_c<Is>(s)...))
{
    return std::tie(boost::fusion::at_c<Is>(s)...);
}

template <typename Sequence, typename Indices = build_indices<boost::fusion::result_of::size<Sequence>::value>>
auto as_std_tuple(const Sequence& s) -> decltype(as_std_tuple_impl(s, Indices()))
{
    return as_std_tuple_impl(s, Indices());
}


template<class Tuple, std::size_t N>
struct TuplePrinter
{
    static void print(const Tuple& t) 
    {
        TuplePrinter<Tuple, N-1>::print(t);
        std::cout << ", " << std::get<N-1>(t);
    }
};

template<class Tuple>
struct TuplePrinter<Tuple, 1> 
{
    static void print(const Tuple& t) 
    {
        std::cout << std::get<0>(t);
    }
};

template<class... Args>
void print(const std::tuple<Args...>& t) 
{
    std::cout << "(";
    TuplePrinter<decltype(t), sizeof...(Args)>::print(t);
    std::cout << ")\n";
}

int main()
{
    std::tuple<int, double, std::string> tup(1,2.5,"hello");
    auto view_rev = boost::fusion::reverse(tup);
    auto reversed_tup = as_std_tuple(view_rev);

    print(tup);
    print(reversed_tup);
    return 0;
}
(1, 2.5, hello)
(hello, 2.5, 1)