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

标签 c++ boost lambda

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

函数本身 (SomeFun) 是另一个类中的成员函数,但对于本示例,我将其设为自由函数。但是,请记住,我可以简单地将它放在 lambda 中或做其他棘手的事情来避免对 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: error: could not convert ‘boost::range_detail::operator|(const InputRng&, const boost::range_detail::transform_holder&) [with 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::range_detail::transformed_range(int&)>, std::vector >’ return outputs | boost::adaptors::transformed(fun); ^ makefile:25: recipe for target '.obj/main.o' failed

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

最佳答案

错误:

test.cpp:29:20: error: no match for ‘operator|’ (operand types are ‘const std::vector’ and ‘std::function >(int)>’) return outputs | fun;

应该非常清楚。没有 operator|对于操作数 vector和一个 function .您的第二个操作数应该是一个 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<Sequence>但是你的 lambda 返回一个 MyStruct<typename Sequence::value_type> .此外,您可能不应该将参数类型硬编码为 int。如果 lambda 期望 Sequence::value_type .您可能应该声明 fun作为类型 Converter<Sequence> .此外,修复 lambda 的参数类型和函数以匹配 Converter (注意引用)。

关于c++ - 如何使用 boost::transformed 在模板构造中使用 lambda 修改序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25422993/

相关文章:

c++ - 重写映射迭代器以返回dynamic_casted值

java - 在java中,在lambda函数内部使用时,三元运算符是否被视为单行表达式?

c++ - 使用任意签名委托(delegate)给 boost::function

c++ - 访问从 union 复制的 union 中的一个成员与另一个成员集是未定义的还是未指定的?

java - 语言之间的服务器客户端首选项

c++ - 如何创建自定义 boost::posix_time to_string 格式化程序?

c++ - 如何将 boost asio tcp 套接字传递给线程以向客户端或服务器发送心跳

c++ - async_write - boost 。它复制缓冲区吗?

python - 如何在使用 AWS Lambda 中的 POST 方法和正文执行 307 重定向时传递请求正文?

java - 如何在 Kotlin 中组合 lambda