2013-12-16 5 views
2

Рассмотрим следующий упрощенный шаблон фасада:C++ фасадных избегая копии

class Foo { 
    public: 
    int times; 

    int eval(const int val) { return val*times; } 
    }; 

    class Bar { 
    Foo foo; 
    public: 
    Bar(const Foo& f) : foo(f) {} 

    double eval(const double val) { return val * foo.times; } 
    }; 

Очевидно, что экземпляр Bar только требуется оценить специальное (т.е. двузначное) интерпретация Eval Foo (в) способ. В баре не будет никаких других участников, кроме foo, на которые он направляется.

Из соображений безопасности я не использовал const ссылку или pointer внутри бара (я просто не знаю, если в какой-то момент экземпляр Bar может уйти от stack кадра, так что управление ресурсами важно).

Мой вопрос здесь два раза:

  1. Может C++компилятор возможно обнаружить, что Bar является лишь фасад и «рядный» доступ членом?
  2. Есть ли (безопасный) способ предотвращения копирования переданного объекта?
+0

** 1. ** возможно, это будет встроено в него. –

ответ

2
  1. На некоторых платформах (ССАГПЗ/Clang) вы можете заставить встраивание с атрибутом always_inline или испускают предупреждения не должны быть функция встраиваемой.
  2. Нет, если вы не хотите копировать, вам необходимо гарантировать срок службы объекта в другом месте. Если вы считаете, что это небезопасно, не делайте этого. Вы можете перемещать объект. Это позволяет избежать проблем с копиями и временем жизни, но может быть невозможен с вашим компилятором.

Например:

struct Bar { 
    // Only accept rvalues of Foo 
    explicit Bar(Foo&& f) : f(std::move(f)) {} 
    Foo f; 
}; 
1

1- Да, компилятор будет скорее всего инлайн функция [Это зависит от компилятора).

2- Всегда придерживаться RAII. В C++ 3, Foo объект foo должен быть либо переменной-членом (как и вы), либо управляемым указателем (скопирован в конструктор копирования и оператор присваивания и удален в деструкторе). В C++ 11 вы можете использовать правую ссылку.

ПРИМЕЧАНИЕ: Этот пример не является фасадом!

+0

Вы правы, это также адаптер, но я всегда считал фасад более «общим» описанием этого шаблона (т. Е. Абстрагированием над намерением) - разве это не так? – choeger

Смежные вопросы