r_levkovych

sfinae

Feb 10th, 2020
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.77 KB | None | 0 0
  1. #include <QObject>
  2. #include <QPointer>
  3.  
  4. template <typename T, typename = void>
  5. struct is_deserializeable : std::false_type {};
  6.  
  7. template <typename T>
  8. struct is_deserializeable <T, decltype(std::declval<QDataStream&>() >> std::declval<T&>())> : std::true_type {};
  9.  
  10. template <typename T, typename = std::enable_if_t<is_deserializeable<T>::value>>
  11. class Property
  12. {
  13. public:
  14.     Property(FruitWrapper* obj)
  15.         : m_obj{obj} { }
  16.     void setValue(const QByteArray& array) noexcept
  17.     {
  18.         if (array.isEmpty()) { return; }
  19.         T value;
  20.         QDataStream dataStream{array};
  21.         dataStream >> value;
  22.         if (value != m_value) {
  23.             m_value = std::move(value);
  24.             emit m_obj->valueChanged();
  25.         }
  26.     }
  27.  
  28.     T getValue() const noexcept { return m_value; }
  29.  
  30. private:
  31.     T m_value = T();
  32.     QPointer<FruitWrapper> m_obj;
  33. };
  34.  
  35. class FruitWrapper: public QObject
  36. {
  37.     Q_OBJECT
  38.     Q_ENUMS(FruitType)
  39.     Q_PROPERTY(FruitType value READ getValue NOTIFY valueChanged)
  40. public:
  41.     enum class Fruit: qint32 {
  42.         APPLE = 0x0000,
  43.         PEACH = 0x0001,
  44.         BANANA = 0x0002
  45.     };
  46.     Data(QObject *parent = nullptr);
  47.     void setValue(const QByteArray &array) override;
  48.     Turn getValue() const;
  49.  
  50. private:
  51.     friend QDataStream& operator<<(QDataStream& out, const FruitWrapper::Fruit& fruit);
  52.     friend QDataStream& operator>>(QDataStream& in, FruitWrapper::Fruit& fruit);
  53.  
  54.     _detail::Property<Enum> m_impl;
  55. };
  56.  
  57. QDataStream& operator<<(QDataStream& out, const FruitWrapper::Fruit& fruit)
  58. {
  59.     out << static_cast<qint32>(fruit);
  60.     return out;
  61. }
  62. QDataStream& operator>>(QDataStream& in, FruitWrapper::Fruit& fruit)
  63. {
  64.     qint32 v;
  65.     in >> v;
  66.     fruit = static_cast<FruitWrapper::Fruit>(v);
  67.     return in;
  68. }
Advertisement
Add Comment
Please, Sign In to add comment