我如何使用boost ::转化修改模板构建使用Lambda序列?(How do I use boos

2019-10-30 11:59发布

我有一个类型MyStruct我想产生一些“序列”,其中的每个实例MyStruct从传递给它的构造另一范围的元件,以及一些功能的输出端产生。

函数本身( SomeFun )是另一个类的成员函数,但在这个例子中,我会让它自由的功能。 但是,请记住,我可以很简单地把它放在里面的λ或做其他棘手的事情,以避免需要一个lambda,因为我确实需要实际传递this在我的实际情况下,周围的指针。

下面是一个简化的,可测试的版本来说明我有这个问题:

#include <iostream>                                                             
#include <vector>                                                               
#include <boost/range/adaptor/transformed.hpp>                                  

#include <functional>                                                           

template <typename RowType>                                                     
class MyStruct;                                                                 

template <typename T>                                                           
int SomeFun(T t)                                                                
{                                                                               
    return 0;                                                                   
}                                                                               

template <typename Sequence>                                                    
using Converter = std::function<                                                
    MyStruct<typename Sequence::value_type>(                                    
        typename Sequence::value_type&)>;                                       

template <typename Sequence>                                                    
boost::transformed_range<Converter<Sequence>, Sequence>                         
    GenerateTransformedRange(const Sequence& outputs)                           
{                                                                               
    std::function<MyStruct<typename Sequence::value_type>(int)> fun =           
        [](const typename Sequence::value_type output)                          
        {                                                                       
            return MyStruct<typename Sequence::value_type>(output, SomeFun(output));
        };                                                                      

    return outputs | boost::adaptors::transformed(fun);                         
}                                                                               

// some structure                                                               
template <typename T>                                                           
struct MyStruct                                                                 
{                                                                               
    MyStruct(T t, int a)                                                        
    {                                                                           
    }                                                                           
};                                                                              

int main(int argc, const char* argv[])                                          
{                                                                               
    std::vector<int> vec {1, 2, 3};                                             

    for (auto element : GenerateTransformedRange(vec))                          
    {                                                                           
    }                                                                           

    return 0;                                                                   
}

从这个输出是:

main.cpp中:31:54:错误:无法转换“的boost :: range_detail ::运算|(常量InputRng&,常量升压:: range_detail :: transform_holder&)[与InputRng =标准::向量; UnaryFunction =标准::函数(INT)>]((*(常量升压:: range_detail :: transform_holder(INT)>

)(&升压:: range_detail ::转发::运算符()(T)const的[与T =标准::函数(INT)>;持有人=升压:: range_detail :: transform_holder](标准::函数(int)的>(((常量的std ::函数(INT)> *)(&乐趣))) '从'升压:: range_detail :: transformed_range(INT)>,常量性病::矢量>'到'升压)))) :: range_detail :: transformed_range(INT&)>,的std ::矢量>”返回输出| 提高::适配器::转化(乐趣); ^生成文件:25:配方目标“的obj / main.o”失败

我在做什么错在这里? 我不QUOT明白为什么它想从该类型转换。 有任何想法吗? 我使用Boost 1.55

Answer 1:

错误:

TEST.CPP:29:20:错误:不对应的 '运营商|' (操作数的类型是“常量性病::矢量”和“标准::函数>(INT)>”)返回输出| 乐趣;

应该是非常清楚。 没有operator| 操作数vector和一个function 。 你的第二个操作数应该是一个升压适配器,它实际上定义操作。 大概是这个样子:

return outputs | boost::adaptors::transformed(fun);

此外,在此代码:

std::function<MyStruct<Sequence>(int)> fun =
        [](const typename Sequence::value_type output)
        {
            return MyStruct<typename Sequence::value_type>(output, SomeFun(output));
        };

据类型声明, fun应该返回MyStruct<Sequence> ,但你的拉姆达返回MyStruct<typename Sequence::value_type> 此外,你可能不应该硬编码参数类型为int如果拉姆达需要一个Sequence::value_type 。 你或许应该申报fun类型Converter<Sequence> 。 此外,固定拉姆达的参数类型和匹配功能Converter (注意参考)。



文章来源: How do I use boost::transformed to modify a sequence using a lambda in a template construct?
标签: c++ boost lambda