Класс шаблонов C ++: хорошей практикой для принятия владения участниками по аргументации шаблона? [закрыто]C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Класс шаблонов C ++: хорошей практикой для принятия владения участниками по аргументации шаблона? [закрыто]

Сообщение Anonymous »

Я сталкиваюсь с проблемой дизайна, рассмотрите следующий код: < /p>

Код: Выделить всё

template
class some_class {
public:
template
some_class(T_&& value) : value_(std::forward(value)) {}
private:
T value_;
};
Мы можем создать тип значения t, такой как oce_class или ссылочный тип some_class , neome_class удерживает владение вектором в первом использовании, а не во второй. Мы не можем четко выяснить владение Value_ В таких случаях эта двусмысленность усложняет управление жизнью объекта, особенно в крупных проектах. Я спрашиваю: «Это хорошая практика для разработки такого класса шаблонов, который позволяет пользователю решать владение с помощью аргумента шаблона». < /P>
сравнить со следующим кодом: < /p>

Код: Выделить всё

template
class some_class {
public:
...
private:
std::decay_t value_;
};
В такой дизайне oke_class ясно удерживает владение Value_, и тот, кто использует некоторую_клес, может безопасно оставить управление временем Value_ to_class.
В целом, я удивляюсь, правильно ли это дать пользователю. /> Поскольку проблема помечена как «основанная на мнениях», давайте поговорим о определенном требовании к дизайну. < /p>

Код: Выделить всё

class object_pool {
...reuse objects...
};

template 
class some_executor {
public:
explicit some_executor() : pool_(...default arguments...) {}

template
explicit some_executor(T&& pool) : pool_(std::forward(pool)) {}
private:
ObjectPool pool_;
};
Рассматривая приведенный выше код, мы можем создать новый acte_executor через его конструктор по умолчанию, что означает, что новый объект object_pool также инициализируется. Кроме того, мы также можем сделать это: some_executor (std :: move (op)) , который перемещает предварительно инициализированный Object_pool oke_executor .
Все выглядит хорошо, но что, если мы хотим code> то же самое объект. экземпляры? < /p>
Ну, мы можем написать следующий код ... < /p>

Код: Выделить всё

auto op = std::make_shared(...some arguments...);

some_executor executor1(op);
some_executor executor2(op);
...
Я знаю, что мы должны сделать что -то большее, чтобы сделать некоторую_executor работать должным образом [/b] с помощью t и std :: shared_ptr , но давайте просто игнорируем это на данный момент.
construal> с этим кодом. И да, с использованием shared_ptr не так уж и плохо, но давайте рассмотрим следующий код:

Код: Выделить всё

object_pool op;

some_executor executor1(std::ref(op));
some_executor executor2(std::ref(op));
...
это вредно и может легко сбое из -за ошибок памяти. С точки зрения A библиотечного дизайнера , используя shared_ptr или t & , является функционально эквивалент ; Мы просто не определили правильный шаблон для некоторого_EXECUTOR , чтобы подтвердить, владеет ли он Object_pool или нет.
Так, наконец, мой вопрос: что такое правильный шаблон ? Должны ли мы просто избегать обмена объектом Object_pool ? (Это то, что я имею в виду под «Интересно, правильно ли дает пользователю такую ​​гибкость» ) или мы должны добавить некоторые типа ограничения к шаблону аргумента objectpool ?

Подробнее здесь: https://stackoverflow.com/questions/796 ... y-template
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»