Что я могу использовать в качестве стандартного базового класса C ++ для RAII + отделение целей? - PullRequest
0 голосов
/ 17 октября 2019

Я ищу выставить класс, который реализует цель RAII и переключает некоторое глобальное состояние. Для всех намерений и целей реализация класса должна быть скрыта. Другими словами, объявление класса выглядит следующим образом:

class ScopedToggleSomething {
public:
    ScopedToggleSomething();
    ~ScopedToggleSomething();
};

и будет использоваться следующим образом:

ScopedToggleSomething localToggle;

это хорошо, но оно многословно. Если бы был какой-то стандартный базовый класс с виртуальным конструктором / деструктором, я мог бы сделать объявление намного проще, например:

std::unique_ptr<std::object> ScopedToggleSomethingFactory();

и использовать его так:

auto localToggle = ScopedToggleSomethingFactory();

и чтопозволяет мне скрыть даже объявление класса. std::object не существует, очевидно, это просто чтобы подчеркнуть. У меня вопрос, есть ли какой-то стандартный базовый класс, который позволил бы мне реализовать такой шаблон и избежать ненужного многословия в заголовке. boost::noncopyable приходит на ум, но у него нет виртуального деструктора, поэтому не будет работать.

РЕДАКТИРОВАТЬ : Мне кажется, я не был уверен, что то, что я искал, это не только RIAA,но также «скрыть» фактическую реализацию функциональности за пределами заголовка и объявить только минимальный необходимый для использования класс

1 Ответ

3 голосов
/ 17 октября 2019

Нет стандартного типа, который вы можете использовать, и если вы думаете о том, что такое RAII, то имеет смысл, что его нет.

RAII (Resource Acquisition Is Initialization) - идиома, в которой объектыКонструктор получает некоторый ресурс, а деструктор объектов освобождает указанный ресурс. Это означает, что вам действительно нужно писать код в этих специальных функциях-членах. Наследование от некоторого типа не поможет вам в этом, потому что этот тип не может знать, каков ваш инвариант. Только вы знаете, что вы должны быть тем, кто пишет код.

Это отличается от чего-то вроде boost::noncopyable, поскольку boost::noncopyable удаляет функциональность. Он использует тот факт, что если в базе есть удаленная специальная функция-член, то все, что из нее происходит, удаляет тот же специальный член для них.

...