C++ 如何使用boost::transformed在模板构造中使用lambda修改序列?

C++ 如何使用boost::transformed在模板构造中使用lambda修改序列?,c++,boost,lambda,C++,Boost,Lambda,我有一个类型MyStruct,我想从中生成一些“序列”,其中MyStruct的每个实例都是通过向其构造函数传递另一个范围的元素以及某个函数的输出而生成的 函数本身(SomeFun)是另一个类中的成员函数,但对于本例,我将使其成为自由函数。但是,请记住,我可以简单地将它放在lambda中,或者做一些其他棘手的事情来避免使用lambda,因为在实际情况中,我确实需要传递一个这个指针 下面是一个简化的、可测试的版本来说明我遇到的问题: #include <iostream>

我有一个类型
MyStruct
,我想从中生成一些“序列”,其中
MyStruct
的每个实例都是通过向其构造函数传递另一个范围的元素以及某个函数的输出而生成的

函数本身(
SomeFun
)是另一个类中的成员函数,但对于本例,我将使其成为自由函数。但是,请记住,我可以简单地将它放在lambda中,或者做一些其他棘手的事情来避免使用lambda,因为在实际情况中,我确实需要传递一个
这个
指针

下面是一个简化的、可测试的版本来说明我遇到的问题:

#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;                                                                   
}
#包括
#包括
#包括
#包括
模板
类MyStruct;
模板
int SomeFun(T)
{                                                                               
返回0;
}                                                                               
模板
使用Converter=std::function<
MyStruct(
typename序列::value_type&)>;
模板
boost::变换的范围
GenerateTransformedRange(常量序列和输出)
{                                                                               
std::function=
[](常量typename序列::值\类型输出)
{                                                                       
返回MyStruct(输出,SomeFun(输出));
};                                                                      
返回输出| boost::Adapters::transformed(有趣);
}                                                                               
//一些结构
模板
结构MyStruct
{                                                                               
MyStruct(T,int-a)
{                                                                           
}                                                                           
};                                                                              
int main(int argc,const char*argv[]
{                                                                               
std::向量向量向量{1,2,3};
对于(自动元素:GenerateTransformedRange(vec))
{                                                                           
}                                                                           
返回0;
}
此操作的输出为:

main.cpp:31:54:错误:无法转换 'boost::range_detail::operator |(常量输入&,常量 boost::range\u detail::transform\u holder&)[带输入 =std::vector;UnaryFunction=std::function(int)>](*(const 增强::范围\细节::变换\保持器(int)>

)(&boost::range_detail::forwarder::operator()(T)const[with T=std::function(int)>;Holder= boost::range\u detail::transform\u holder](标准::函数(int)>((常量 std::function(int)>*)(&fun‘‘‘‘‘‘‘)‘)from 'boost::range\u detail::transformed\u range(int)>, 常数std::vector>“到” 'boost::range\u detail::transformed\u range(int&)>, std::vector>' 返回输出| boost::Adapters::transformed(有趣); ^makefile:25:目标'.obj/main.o'的配方失败

我做错了什么?我不明白它为什么要从那个类型转换过来。有什么想法吗?我使用的是
Boost 1.55

错误:

test.cpp:29:20:错误:与“运算符|”不匹配(操作数类型为“const std::vector”和“std::function>(int)>”) 返回输出|乐趣

应该非常清楚。操作数
向量
函数
没有
运算符
。第二个操作数应该是实际定义运算符的boost适配器。可能是这样的:

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));
        };
std::函数乐趣=
[](常量typename序列::值\类型输出)
{
返回MyStruct(输出,SomeFun(输出));
};
根据类型声明,
fun
应该返回一个
MyStruct
,但是您的lambda返回一个
MyStruct
。另外,如果lambda需要一个
Sequence::value\u type
,则可能不应该将参数类型硬编码为
int
。您可能应该将
fun
声明为类型
Converter
。另外,修复lambda的参数类型和与转换器匹配的功能(请注意参考)。

错误:

测试。cpp:29:20:错误:无mat