Как я могу обобщить / обобщить реализацию логического прокси?
Я работаю над объектом-оберткой для некоторых вещей. Давайте назовем этот класс Foo
, Теперь Foo поставляется с библиотекой, предлагающей API в стиле C, включая, среди прочего, функции:
foo_status_type fooSetBar(int foo_id, bar_value_type new_bar_value);
foo_status_type fooGetBar(int foo_id, bar_value_type* bar_value);
На данный момент у меня в основном есть:
class Foo {
const int id_;
bar() const {
bar_value_type bv{};
auto status = fooGetBar(id_, &bv);
// error handling
return bv;
}
void bar(bar_value_type v) {
auto status = fooSetBar(id_, v);
// error handling
}
}
Дело в том, bar_value_type
на самом деле имеет только два значения. Итак, я решил, что хочу реализовать объект логического прокси, чтобы я мог написать:
if (my_foo.bar and other_condition) { do_whatever(); }
а также:
my_foo.bar = false;
и для этого просто работать. Теперь, очевидно, я могу это сделать, но на самом деле существует более одного вида bar
с таким поведением, поэтому я хочу написать "универсальный логический прокси". Это опять не большая проблема -
template<typename Getter, typename Setter>
class gbp {
gbp(const Getter& getter, const Setter& setter) : getter_(getter), setter_(setter) { }
// etc. etc.
protected:
const Getter const& getter_;
const Setter const& setter_;
}
но я хочу избежать хранения адресов. Это достижимо? Если нет - я пытаюсь сделать "неправильную вещь" здесь?
Извините за длинное описание - я не хотел, чтобы это была проблема XY, поэтому я предоставил более или менее полную мотивацию.