The call to ImGui::InputText() takes a char array which I need to initialise from a std::string and then transfer the contents back to the std::string. In it's simplest form:

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; } 

However, it appears wasteful to have two buffers (buf and the buffer allocated within std::string) both doing much the same thing. Can I avoid the buf buffer and the copying to and from it by using just the std::string and a simple wrapper "X". I don't care about efficiency, I just want the simplest code at the call site. This code does work but is it safe and is there a better way?

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() ); } 
0

1 Answer

If you want to use InputText() with std::string or any custom dynamic string type, see misc/cpp/imgui_stdlib.h and comments in imgui_demo.cpp.

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); } 

Your first code

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

Reading manuals works wonders.

3

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.