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&lt;T&gt; 标准库有什么替代品吗? 我刚才提到了一个 你可以拥有share_ptr的vector并返回weak_ptr,这样你可以确保正确的引用。 【参考方案1】:

有什么好的和安全的方法来做到这一点?

保存这对夫妇(矢量参考,Foo 的索引),假设 Foos 只添加在后面。

加上一点语法糖:

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)

为啥 std::string 引用不能采用 char*?

高效操作字串的String Reference类

C ++通过引用dll中的函数传递std :: string

如何通过值或常量引用传递 std::string_view

std::string 的引用计数