在 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的主要内容,如果未能解决你的问题,请参考以下文章