Как я могу обобщить / обобщить реализацию логического прокси?

Я работаю над объектом-оберткой для некоторых вещей. Давайте назовем этот класс 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, поэтому я предоставил более или менее полную мотивацию.

0 ответов

Другие вопросы по тегам