arduino 引用std::string 报错
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了arduino 引用std::string 报错相关的知识,希望对你有一定的参考价值。
参考技术A 使用<iostream库允许你使用如下的语法将一个std::string转换为美妙得多的任何东西。
return0。0;std::istringstream对象i提供了类似std::cin提供的格式化工具,可以使用操纵器和格式化标志来控制格式化的结果。
如何安全地引用 std::vector 元素?
【中文标题】如何安全地引用 std::vector 元素?【英文标题】:How I can safely reference to an std::vector element? 【发布时间】:2021-05-16 22:31:34 【问题描述】:我想创建一个为其他结构保持更高状态的结构。
我尝试这样创建它,但我最近发现返回指向 std::vector 元素的指针并不安全,因为该指针可以更改。
struct Foo
std::string &context;
std::string content;
Foo(std::string &context, std::string content) : context(context), content(content)
struct Bar
std::string context;
std::vector<std::string> manyFoos;
Foo* addFoo(std::string content)
manyFoos.emplace_back(context, content);
return &manyFoos[manyFoos.size() - 1];
struct Example
Bar bar;
Foo* fooA;
Foo* fooB;
Example()
fooA = bar.addFoo("Hello");
fooB = bar.addFoo("World");
有什么好的和安全的方法来做到这一点?
【问题讨论】:
使用其他容器代替 std::vector? ^^ 例如std::list<T>
标准库有什么替代品吗?
我刚才提到了一个
你可以拥有share_ptr的vector并返回weak_ptr,这样你可以确保正确的引用。
【参考方案1】:
有什么好的和安全的方法来做到这一点?
保存这对夫妇(矢量参考,Foo
的索引),假设 Foo
s 只添加在后面。
加上一点语法糖:
struct Bar
std::string context;
std::vector<Foo> manyFoos;
struct FooProxy
std::vector<Foo>& foos;
std::vector<Foo>::size_type index;
operator Foo() return foos[index];
;
auto addFoo(std::string content)
manyFoos.emplace_back(context, content);
return FooProxymanyFoos, manyFoos.size()-1;
;
Live example
【讨论】:
【参考方案2】:你可以拥有shared_ptr的向量并返回weak_ptr,这样你可以确保正确引用
#include <iostream>
#include <vector>
#include <memory>
struct Foo
std::string &context;
std::string content;
Foo(std::string &context, std::string content) : context(context), content(content)
;
struct Bar
std::string context;
std::vector<std::shared_ptr<Foo>> manyFoos;
std::weak_ptr<Foo> addFoo(std::string content)
auto foo = std::make_shared<Foo>(context, content);
manyFoos.emplace_back(foo);
return foo;
;
void printFoo(std::weak_ptr<Foo> foo)
// Here we are checking weak_ptr expiry
std::cout << (foo.expired() ? "Foo Expired" : foo.lock()->content) << std::endl;
int main()
Bar bar;
std::weak_ptr<Foo> fooA;
std::weak_ptr<Foo> fooB;
fooA = bar.addFoo("Hello");
fooB = bar.addFoo("World");
printFoo(fooA);
printFoo(fooB);
// erase last element
bar.manyFoos.pop_back();
printFoo(fooB);
return 0;
输出:
Hello
World
Foo Expired
【讨论】:
以上是关于arduino 引用std::string 报错的主要内容,如果未能解决你的问题,请参考以下文章
SWIG:如何包装 std::string&(通过引用传递的 std::string)