Advertisement
T4ng10r

C++ Class template and type deduction from inherited parent

Aug 26th, 2020
1,923
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.34 KB | None | 0 0
  1. #include <iostream>
  2. #include <functional>
  3. #include <memory>
  4.  
  5. class QTRO_1Source {
  6. public:
  7.     void hvEnabledChanged(bool) {};
  8.     virtual bool hvEnabled() const = 0;
  9. };
  10.  
  11. class QTRO_1SimpleSource : public QTRO_1Source {
  12. public:
  13.     bool hvEnabled() const override { return false; }
  14. };
  15.  
  16. class QTRO_1 : public QTRO_1SimpleSource {
  17. public:
  18.     void write_hvEnabled(bool/*enabled*/) { }
  19. };
  20.  
  21.  
  22. template<typename ReplicaType, typename ValueType>
  23. class ProxyProperty
  24. {
  25. public:
  26.     using ReadFuncPtr = ValueType (ReplicaType::*)() const;
  27.     using WriteFuncPtr = void (ReplicaType::*)(ValueType);
  28.     using ChangeSigFuncPtr = void (ReplicaType::*)(ValueType);
  29.     using UpdateHandlerFunctor = std::function<void(ValueType value)>;
  30.     ProxyProperty(ReplicaType *replica,
  31.                   ReadFuncPtr readFunc,
  32.                   WriteFuncPtr writeFunc,
  33.                   ChangeSigFuncPtr changeSignal,
  34.                   UpdateHandlerFunctor updateHandler)
  35.     {
  36.         m_replica = replica;
  37.         m_readFunc = readFunc;
  38.         m_writeFunc = writeFunc;
  39.         m_changeSignal = changeSignal;
  40.         m_updateHandler = updateHandler;
  41.     }
  42.     template<typename T, typename HandlerT>
  43.     void write(T value, HandlerT handler) {
  44.         (m_replica->*m_writeFunc)(value);
  45.     }
  46. private:
  47.     ReplicaType *m_replica;
  48.     ReadFuncPtr m_readFunc;
  49.     WriteFuncPtr m_writeFunc;
  50.     ChangeSigFuncPtr m_changeSignal;
  51.     UpdateHandlerFunctor m_updateHandler;
  52.     int m_timeout{3000};
  53. };
  54.  
  55. template<typename ReplicaType, typename ValueType, typename UpHandlerT>
  56. auto createProxyProperty(ReplicaType *replica,
  57.                          ValueType (ReplicaType::*readFunc)() const,
  58.                          void (ReplicaType::*writeFunc)(ValueType),
  59.                          void (ReplicaType::*changeSignal)(ValueType),
  60.                          UpHandlerT upHandler)
  61. {
  62.     return std::make_unique<ProxyProperty<ReplicaType,ValueType> >(replica, readFunc, writeFunc, changeSignal, upHandler);
  63. }
  64.  
  65. int main(int argc, char *argv[]){
  66.     QTRO_1 model;
  67. //    static auto p = createProxyProperty<QTRO_1, bool>(
  68.     static auto p = createProxyProperty(
  69.                 &model,
  70.                 &QTRO_1::hvEnabled,
  71.                 &QTRO_1::write_hvEnabled,
  72.                 &QTRO_1::hvEnabledChanged,
  73.         [](auto val) { std::cout<< "COSTAM"; }
  74.     );
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement