Шаблон C ++ смешан с проблемой вывода типа C struct - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь разобрать JSON с помощью этого решения C ++ JSON Сериализация

, но разница в том, что я пытаюсь проанализировать непосредственно C struct, поэтому одной из проблем является присвоение строки.

Ошибка заключается в следующем:

   **error: incompatible types in assignment of 'int' to 'char [128]'
              obj->*(property.member) = a;**

Но если я переключусь с использования простого массива char на использование std :: string внутри Cat структура, все в порядке. Любые идеи о том, как я могу сделать эту работу, используя простую строку стиля C? я не хочу изменять структуру Cat.

#define STR_LEN 128

struct Cat {
    char name [STR_LEN];
    int age;
};



template<typename T>
void fromJson(const json& data, T &object) {

constexpr auto nbProperties = std::tuple_size<decltype(T::properties)>::value;

for_sequence(std::make_index_sequence<nbProperties>{}, [&](auto i){
    constexpr auto property = std::get<i>(T::properties);

    if (data.contains(property.name))
    {
        auto *obj = object.c; // the Cat inner object
        if(data[property.name].is_string())
        {
               const char *str  = data[property.name].dump().c_str();
               std::cout  << " is string > " << str << std::endl;
             // strncpy(&(obj->*(property.member)), str, STR_LEN);
        }
        else
         {
             std::cout << data[property.name] << std::endl;
             int a = data[property.name];
             obj->*(property.member) = a;
            // obj->*(property.member) = data[property.name];
         }
    }

});
}


class CatParser {

    public:
    Cat *c;
    CatParser() {}
    CatParser(Cat *cat): c(cat) { }

    constexpr static auto properties = std::make_tuple(
            property(&Cat::name, "name"), property(&Cat::age, "age"));
    };


int main() {

    json j;
    j["name"] = "Kitty";
    j["age"] = 3;
    Cat c;

    CatParser cp(&c);

    fromJson<CatParser>(j, cp);

    return 0;
}
...