在 ImGui::InputText(...) 中使用 std::string

Posted

技术标签:

【中文标题】在 ImGui::InputText(...) 中使用 std::string【英文标题】:Using std::string in ImGui::InputText(...) 【发布时间】:2021-09-03 14:35:00 【问题描述】:

ImGui::InputText() 的调用需要一个char 数组,我需要从std::string 对其进行初始化,然后将内容传输回std::string。最简单的形式:

char buf[255];
std::string s"foo";
void fn()     
    strncpy( buf, s.c_str(), sizeof(buf)-1 );
    ImGui::InputText( "Text", buf, sizeof(buf) );
    s=buf;

但是,让两个缓冲区(buf 和在std::string 中分配的缓冲区)都做同样的事情似乎很浪费。我可以通过仅使用std::string 和一个简单的包装器“X”来避免buf 缓冲区以及与它之间的复制吗? 我不关心效率,我只想要调用站点上最简单的代码。 这段代码确实有效,但它安全吗?有更好的方法吗?

class X 
public:
    X(std::string& s) : s_s  s.resize(len_); 
    ~X()  s_.resize(strlen(s_.c_str())); 
    operator char*() return s_.data(); 
    static constexpr auto len()  return len_-1; 
private:
    std::string& s_;
    static constexpr auto len_=255;
;

std::string s"foo";

void fn() 
    ImGui::InputText( "Text", X(s), X::len() );

【问题讨论】:

【参考方案1】:

如果您想将 InputText()std::string 或任何自定义动态字符串类型一起使用,请参阅 imgui_demo.cpp 中的 misc/cpp/imgui_stdlib.h 和 cmets。

misc/cpp/imgui_stdlib.h

namespace ImGui

    // ImGui::InputText() with std::string
    // Because text input needs dynamic resizing, we need to setup a callback to grow the capacity
    IMGUI_API bool  InputText(const char* label, std::string* str, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);
    IMGUI_API bool  InputTextMultiline(const char* label, std::string* str, const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);
    IMGUI_API bool  InputTextWithHint(const char* label, const char* hint, std::string* str, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);

你的第一个代码

std::string s"foo";
void fn()     
    ImGui::InputText( "Text", &s );

阅读手册可以创造奇迹。

【讨论】:

imgui_demo.cpp 多次有评论:“要将 InputText() 与 std::string 或任何其他自定义字符串类型连接,请参阅此演示的“文本输入 > 调整回调”部分,以及misc/cpp/imgui_stdlib.h 文件”。同样,阅读手册也能创造奇迹。

以上是关于在 ImGui::InputText(...) 中使用 std::string的主要内容,如果未能解决你的问题,请参考以下文章

存储在 plist 中的数据在模拟器中有效,但在设备中无效

在 C 中声明 == 在 C++ 中定义? [复制]

初始化发生在哪里,在 init 方法中还是在实例声明中?

查询在数据库中花费了更多时间,尽管在连接条件中使用了索引列,那么我们可以在代码中做些啥来优化

在 Athena 中,如何在结构中的数组中查询结构的成员?

在 UISearchController 中搜索时无法在 tableView 中滚动