Есть ли функция для анализа общего указателя glib GVariant в const char*?
Например, как это сделано в DBus?
signal time=1717768489.237441 sender=:1.22 -> destination=(null destination) serial=17 path=/org/bluez/hci0; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.bluez.Adapter1"
array [
dict entry(
string "Powered"
variant boolean false
)
dict entry(
string "Discovering"
variant boolean false
)
]
array [
]





Я наконец нашел это! Очевидно, я бы предпочел std::string, чем const char*, но поскольку эта библиотека очень C-стилизована, у меня не было такой надежды. Несколько громоздкий API можно спрятать во вспомогательной функции:
std::string print_variant(GVariant* v) {
auto* res = g_variant_print_string(v, nullptr, true);
if (nullptr == res->str) {
return "NULL";
}
std::string retval(res->str, res->len);
g_string_free(res, true);
return retval;
}
Вы проверили, есть ли у glibmm эквивалент? Я считаю, что это привязки GLib в стиле C++.
GString на самом деле является API-интерфейсом для построения строк, но его название несколько неверно. g_variant_print менее громоздкий, потому что вам не нужно возиться с объектом построителя строк, он просто вернет недавно выделенный 0-заканчивающийся char*:
std::string print_variant(GVariant *v) {
g_autofree char* res = g_variant_print(v, true);
return {res};
}
Обратите внимание: вам не нужен
const char*, вам нуженstd::string. И сколько усилий вы приложили для поиска библиотеки/документации>