我正在学习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) 我无法访问普通协议缓冲区消息中的(嵌套)枚举。我尝试了任何一种方式,嵌套或与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) 我正在尝试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)
什么造成麻烦?