Должны ли мы сериализовать класс std :: chrono :: duration или это POD (Plain Old Data) и сериализация не нужна? - PullRequest
0 голосов
/ 21 января 2019

У меня есть спор с моим другом о P.O.D типах в C ++. Вся суета связана с тем, будем ли мы сериализовать структуру ниже или нет. И мы должны сериализовать, если структура не является P.O.D. (Plan Old Data).

Он говорит, что если в официальном стандарте не указано, что std :: chrono :: duration должно быть POD , то это зависит от реализации, и мы безопаснее, когда мы всегда сериализуйте это.

Однако я написал небольшой код gist , который доказывает, что он тривиален, имеет стандартное расположение и, таким образом, P.O.D.

#include <iostream>
#include <chrono>

struct myStruct
{
    std::chrono::seconds timeSec;
};

int main () {
    std::cout << std::boolalpha << "is_pod<std::chrono::seconds> = "
              << std::is_pod<std::chrono::seconds>() << std::endl
              << "is_pod<myStruct> = " << std::is_pod<myStruct>() << std::endl;


    std::cout << std::boolalpha << "is_trivial<std::chrono::seconds> = "
              << std::is_trivial<std::chrono::seconds>() << std::endl
              << "is_is_standard_layout<std::chrono::seconds> = "
              << std::is_standard_layout<std::chrono::seconds>() << std::endl;

    std::cout << std::boolalpha << "is_trivial<myStruct> = "
              << std::is_trivial<myStruct>() << std::endl
              << "is_is_standard_layout<myStruct> = "
              << std::is_standard_layout<myStruct>() << std::endl;
}

1 Ответ

0 голосов
/ 21 января 2019

Ваш код «доказывает» только одно: реализованная вами реализация реализована duration так, что его можно легко скопировать и стандартную компоновку. Ничто в стандарте не требует, чтобы было так, поэтому любая другая реализация (включая более поздние версии той же библиотеки ) может свободно изменять правила.

Теперь вы можете выполнить некоторую if constexpr / enable_if или аналогичную гимнастику, чтобы, если реализация обеспечивает тривиальное копируемое свойство, вы использовали эту возможность, а не "сериализовали" ее. Но вы не можете предполагать , что это всегда будет иметь место (если вы не работаете в среде, где вы знаете, что всегда будете использовать определенную библиотеку); Вы можете просто воспользоваться этим, где это возможно.

...