Мой код C ++ 17 использует std::atomic<MyVariant>
, который определяется как
using MyVariant = std::variant<std::monostate, bool, unsigned int, int, double, void*>
При использовании современного clang, is_trivially_copyable<MyVariant>
верно, но с некоторыми другими компиляторами, такими как современный Intel C (19.0.3), копировать нетривиально. Это означает, что я не могу использовать его в типе atomi c. Я предполагаю, что это связано с его реализацией внутри компилятора Intel - я не думаю, что стандарт требует, чтобы варианты были легко копируемыми.
Теперь я рассматриваю альтернативы. Вот что мне нужно сделать (что я сейчас и делаю с вышеуказанным подходом):
- загрузить новый тип atomi c variable / generi c из MyVariant без зная содержащийся тип (например, я не хочу извлекать указанный c тип с помощью
std::get
) - выполнить сравнение_exchange_weak для нового альтернативного типа, не зная содержащегося в нем типа
- сохранить полученное значение обратно в переменную MyVariant правильного типа
Я готов быть немного небезопасным для этого фрагмента кода, который будет небольшим и внутренним.
Я попытался реализовать этот следующий подход, но он не компилируется без std::get
содержащегося в нем типа:
MyVariant val = 42.2;
std::atomic<uint64_t> atomic_v;
atomic_v.store(val); // fails to compile without a std::get<double>(val)
Пожалуйста, дайте мне знать ваши мысли о том, как я могу оба: 1) делать atomi c операции над 64-битным фрагментом данных без заботы о типе и 2) последующее преобразование его обратно в MyVariant без знания типа. Есть ли способ проанализировать тип варианта и сохранить его / как-нибудь его использовать?
Если это невозможно, мне придется изменить свой API.