Я пытаюсь создать прокси -класс прокси -сервера в C ++ для управления транзакциями через дерево узлов (INode) Формирование модели данных моей приложения.
Вот очень простой пример:
, который я хотел бы, чтобы это было так: p> p>
, который я хотел бы доступить как as as a triviell as a triviell. />
rootNode->getA()->getX();
rootNode->getA()->setX(42.0f);
// NOT: rootNode->getA().edit()->setX(42.0f);
Когда называется сеттер (например, setx ), необходимо создать кэш для управления механизмом транзакции, то есть: geta () в первых вызовах с помощью getx () возвращает прокси, указывающий на Nodea без создания кеша. Но geta () перед setx требует генерирования этого кэша./* Transaction wrapper template:
We attempt to have different behaviour, base on if the wrapper->getter()-const or wrapper->setter()
being getter and setter members of T
template */
class TransactionProxy {
public: using NonConstT = std::remove_cv_t < T > ;
// For const access
const T * operator -> () const {
std::cout
T * operator -> () {
std::cout (m_obj));
// INITIALIZATION of Transaction cache here!!
return w;
}
TransactionProxy(T * obj): m_obj(obj) {}
private: T * m_obj;
};
// ... dots
// Within RootNode
TransactionProxy <
const NodeA > getA() const {
return TransactionProxy <
const NodeA > (m_a.get());
}
< /code>
Это не работает, поскольку оператор актеров не работает неявно. 1: < /strong> операция только для чтения
const operator-> all to 8noderoot
const operator-> Вызов для 5Nodea
Получение x Значение: 1 < /p>
Пример 2: < /strong> write
const Orporation-> Вызов 8NODOROOTISIZIZIZE COM 5nodea
non-const operator-> Вызов для 5nodea
x от 1 до 42 < /p>
< /blockquote>
Примечание: как вы видите, только последний оператор-> () < /code> перед Setx () < /code> не является Constst, и создает C-node node node node node node node node node node node node nodest no-const. Nodea .
Можно ли реализовать что -то подобное без рефлексии TS? Как? < /Strong> < /p>
фрагмент кода: < /strong> < /p>
#include
#include
class INode {};
/* Transaction wrapper template:
We attempt to have different behaviour, base on if the wrapper->getter()-const or wrapper->setter()
being getter and setter members of T
template */
class TransactionProxy {
public: using NonConstT = std::remove_cv_t < T > ;
// For const access
const T * operator -> () const {
std::cout
T * operator -> () {
std::cout (m_obj));
// INITIALIZATION of Transaction cache here!!
return w;
}
TransactionProxy(T * obj): m_obj(obj) {}
private: T * m_obj;
};
class NodeA: public INode {
private: float m_x;
public: NodeA(float x): m_x(x) {}
float getX() const {
std::cout getX();
}
std::cout (rootW -> getA()) -> setX(42.0 f);
// rootW->getA()->setX(42.0f); // NOT WORKING!!
// setX require a TransactionProxy (non-const)
// Looking for implicit const conversion, or const priority over non-const overloads
}
}
Подробнее здесь: https://stackoverflow.com/questions/795 ... ition-in-c
Прокси-констант в неконфессиональный неявный переход в C ++? ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение