当前位置: 首页 > 知识库问答 >
问题:

如何使用Boost::Transformed来修改模板构造中使用lambda的序列?

雍马鲁
2023-03-14

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

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

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

#include <html" target="_blank">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::operator(const InputRng&,const boost::range_detail::transform_holder&)”[其中InputRng=std::vector;UnaryFunction=std::function(int)>]((*(const boost::range_detail::transform_holder(int)>

)(&boost::range_detail::forwarder::operator()(T)const[with T=std::function(int)>;Holder=boost::range_detail::transform_holder](std::function(int)>((const std::function(int)>*)(&fun)))))“from”boost::range_detail::transformed_range(int)>,const std::vector>“to”

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

共有1个答案

金宣
2023-03-14

错误:

test.cpp:29:20:错误:“operator”不匹配(操作数类型为“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));
        };

根据类型声明,fun应该返回MyStruct ,但您的lambda返回MyStruct 。此外,如果lambda需要sequence::value_type,您可能不应该将参数类型硬编码为int。您可能应该将fun声明为类型converter 。另外,固定lambda和函数的参数类型,使其与converter匹配(注意参考)。

 类似资料:
  • 问题内容: 我正在尝试第一次使用PowerMockito模拟类构造函数,但是它不起作用。我当前的代码是: 测试失败,因为返回的值为“ Fail”。我的问题在哪里? 问题答案: Okey,找到答案了,您需要致电 代替

  • 我有一个Typescript中的构造函数,其中构造了一个datatable,其值为“orderable”、“data”和“name”。我的问题是: 如何根据同一行中另一列的值设置一列的可见性?我尝试了渲染,这使得我可以编辑文本。因此,如果我编辑文本,我能做的最好的是将其设置为空字符串("),这不是我想要的。我想要的是隐藏那一行中的列,例如,通过“可见:虚假”可以实现的东西。下面是我的例子,在构造函

  • 问题内容: 我想为MySortedSet调用一个构造函数,该构造函数将Comparator c作为参数。我该如何修改呢? 问题答案: 如果要传递其他捕获的值作为参数,则不能使用方法引用。您将不得不使用lambda表达式来代替: =>

  • 我们正在谷歌云上建立机器学习管道,利用GC ML-Engine进行分布式TensorFlow训练和模型服务,利用DataFlow进行分布式预处理作业。 我们想在谷歌云上运行我们的Apache Beam应用程序作为DataFlow作业。查看ML-Engine示例,似乎可以获得tensorflow_transform.beam.implAnalyzeAndTransformDataset来指定要使用的

  • 问题内容: 我正在尝试使用Jackson 1.9.10反序列化此类的实例: 当我尝试这个我得到以下 冲突的基于属性的创建者:已经有… {界面org.codehaus.jackson.annotate.JsonCreator @ org.codehaus.jackson.annotate.JsonCreator()}],遇到了…,注释:{接口org.codehaus。 jackson.annotat

  • 主要内容:问题描述,使用Ennead构造Decade的示例问题描述 如何使用Ennead构造Decade 使用Ennead构造Decade的示例 每个元组都有 add() 和 addAtX() 方法来转换元组。 输出结果为: