Является ли этот ключ-ориентированный шаблон защиты доступа известной идиомой?

Matthieu M. разработал шаблон для защиты доступа в этом ответе, который я видел раньше, но никогда не считал его шаблоном:

class SomeKey { friend class Foo; SomeKey() {} // possibly make it non-copyable too }; class Bar { public: void protectedMethod(SomeKey); }; 

Здесь только friend of class class имеет доступ к protectedMethod() :

 class Foo { void do_stuff(Bar& b) { b.protectedMethod(SomeKey()); // fine, Foo is friend of SomeKey } }; class Baz { void do_stuff(Bar& b) { b.protectedMethod(SomeKey()); // error, SomeKey::SomeKey() is private } }; 

Он позволяет осуществлять более мелкомасштабный контроль доступа, чем делать Foo friend Bar и избегать более сложных прокси-шаблонов.

Кто-нибудь знает, имеет ли этот подход уже имя, т. Е. Это известный шаблон?

Благодаря вашему другому вопросу, похоже, этот шаблон теперь известен как шаблон «passkey».

В C ++ 11 он становится еще более чистым, потому что вместо вызова

 b.protectedMethod(SomeKey()); 

вы можете просто позвонить:

 b.protectedMethod({}); 

Похоже, эта идиома, подобная той, что упоминается в другом SO-вопросе здесь . Он называется идиомой Адвокат-Клиент и более подробно описан там .

какой-то скучный человек, как я, сделает код fowllow:

 int FraudKey=0; b.protectedMethod(reinterpret_cast(FraudKey)); 

Его довольно близко к этому:

http://minorfs.wordpress.com/2013/01/18/raiicap-pattern-injected-singleton-alternative-for-c/

В принципе, если вы считаете ссылку на объект хорошо продуманного classа, который должен обеспечить управление доступом, вам нужно реализовать любую политику управления доступом, которая действительно имеет смысл, применение этого шаблона ко всему, кроме конструктора, похоже, не имеет такого смысла.

Как говорится в статье, если вы используете этот ключ в сочетании с теми конструкторами, для которых может иметь смысл управление доступом, объекты, которые представляют значительную часть ресурсов пугает, то в C ++ обычно реализуются как объекты RAII, чем имя RAIICap или RAII Способность действительно имеет смысл.

http://www.eros-os.org/essays/capintro.html

В качестве альтернативы вы можете ссылаться на него с более общим именем, например, над конструкцией.

Реализация в этой статье немного в основном сосредоточена, то есть в основном необходимо создать все ключи полномочий. Вы можете расширить его и сделать его более гибким, добавив дополнительный публичный конструктор для самого ключа:

 template  class construct_authority { public: construct_authority(construct_authority const&) friend int main(int,char **); private: construct_authority(){} }; 

Таким образом, главная функция может делегировать создание ключа другим частям программы.

Лично я считаю, что имя RAIICap вполне подходит для полезной части этого шаблона.

Некоторое время назад я предложил, чтобы этот простой шаблон выше можно было добавить в стандартную библиотеку.

https://groups.google.com/a/isocpp.org/forum/#!topic/std-proposals/p_v-aYIvO1E

К сожалению, есть проблемы с идеей о том, что может быть один основной отпечаток, который представляет собой вычислительный корень, поэтому что-то вроде этого, по-видимому, не может иметь места в стандартной библиотеке. Сказав это, по крайней мере, для использования с конструктором classов RAII, эта схема представляется весьма полезной.

  • ViewPager и fragmentы - какой способ сохранить состояние fragmentа?
  • UI Design Pattern для Windows Forms (например, MVVM для WPF)
  • Шаблон дизайна для Undo Engine
  • Реализация шаблона пула объектов C #
  • Что такое инъекция зависимости?
  • Где разместить AutoMapper.CreateMaps?
  • Как объяснить инъекцию зависимости к 5-летнему ребенку?
  • Моностат против Синглтона
  • Лучший способ использования StructureMap для реализации шаблона страtagsи
  • Разница между статическим classом и одноэлементным шаблоном?
  • Что такое инверсия контроля?
  • Давайте будем гением компьютера.