小编Afo*_*box的帖子

传递非泛型函数的最有效方法是什么?

我正在学习C++中的函数式编程.我的目的是将非泛型函数作为参数传递.我知道模板方法,但是我想将函数签名限制为API设计的一部分.我在cpp.sh上编写了4个不同的方法示例:

// Example program
#include <iostream>
#include <string>
#include <functional>

typedef int(functor_type)(int);


int by_forwarding(functor_type &&x)  {
    return x(1);
}

int functor_by_value(functor_type x) {
    return x(1);
}

int std_func_by_value(std::function<functor_type> x) {
    return x(1);
}

int std_func_by_forwarding(std::function<functor_type> &&x) {
    return x(1);
}

int main()
{
    std::cout << functor_by_value([](int a){return a;}); // works
    std::cout << std_func_by_value([](int a){return a;}); // works
    std::cout << std_func_by_forwarding(std::move([](int a){return a;})); // works

    //std::cout << by_forwarding([](int a){return a;}); // how to move lambda with forwarding …
Run Code Online (Sandbox Code Playgroud)

c++ function functor std-function

13
推荐指数
4
解决办法
878
查看次数

无法访问python 3中的(嵌套)枚举类型(proto3)

我无法访问普通协议缓冲区消息中的(嵌套)枚举。我尝试了任何一种方式,嵌套或与DataNodeManagement!分开:

syntax = "proto3";

message DataNodeManagement {
  string name = 1;
  string id = 2;
  string origin = 3;
  ConnectionType con_type = 4;
  enum ConnectionType {
    UNKNOWN = 0;
    MQTT = 1;
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用此代码在我的消息中填充数据:

config = data_node_pb2.DataNodeManagement()
config.name = "Scanner1"
config.id = key
config.origin = "PC1"
config.con_type = data_node_pb2.ConnectionType.MQTT
# or 
# config.con_type = data_node_pb2.DataNodeManagement.ConnectionType.MQTT

datasource.advertise_data_node(config.SerializeToString())
Run Code Online (Sandbox Code Playgroud)

它抱怨:

Traceback (most recent call last):
  File "scanner-connector.py", line 144, in <module>
    config.con_type = data_node_pb2.ConnectionType.MQTT
AttributeError: 'EnumTypeWrapper' object has no attribute …
Run Code Online (Sandbox Code Playgroud)

python protocol-buffers python-3.x

4
推荐指数
1
解决办法
2638
查看次数

Lambda函数不会使用不同的签名进行编译

我正在尝试c ++ lambda函数:

这有效:

std::function<std::string(std::string)>lambda = [] (std::string message) -> std::string
   {
       return std::string("test");
   };
Run Code Online (Sandbox Code Playgroud)

我可以调用函数std::cout << lambda(std::string("in"));,然后打印"test".

但是,如果我传递另一种类型(std::istream)它不会编译.从std::istream任何类型到任何类型的映射都应该是最终目标.我将为此目的使用模板.:

std::function<std::string(std::istream)>lambda = [] (std::istream message) -> std::string
   {
       return std::string("test");
   };
Run Code Online (Sandbox Code Playgroud)

这是g ++的输出:

g++ -I"/home/***/workspace.cpp/unrealcv-renderer/include" -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/unrealcv_renderer.d" -MT"src/unrealcv_renderer.o" -o "src/unrealcv_renderer.o" "../src/unrealcv_renderer.cpp"
../src/unrealcv_renderer.cpp: In constructor ‘event_camera_simulator::UnrealCVRenderer::UnrealCVRenderer(std::__cxx11::string, std::__cxx11::string)’:
../src/unrealcv_renderer.cpp:23:8: error: conversion from ‘event_camera_simulator::UnrealCVRenderer::UnrealCVRenderer(std::__cxx11::string, std::__cxx11::string)::<lambda(std::istream)>’ to non-scalar type ‘std::function<std::__cxx11::basic_string<char>(std::basic_istream<char>)>’ requested
        };
        ^
Run Code Online (Sandbox Code Playgroud)

什么造成麻烦?

c++ lambda

1
推荐指数
1
解决办法
78
查看次数