Как Херб Саттерс контролирует работу класса? - PullRequest
5 голосов
/ 04 марта 2020

Я пытаюсь понять класс монитора, представленный Хербом Саттером на C ++ и после 2012 года:

template<typename T>
class monitor {
private:
    mutable T t;
    mutable std::mutex m;

public:
    monitor(T t_ = T{}) : t{ t_ } {} 
    template<typename F>
    auto operator()(F f) const -> decltype(f(t))
    {
        std::lock_guard<std::mutex> _{ m }; return f(t);
    }
}; 

Мне удалось создать класс, который делает то же самое в более старомодном и простом виде ( по крайней мере для меня) путь:

template<typename T>
class MyMonitor {
public:
    MyMonitor() { t = T(); }

    template<typename F>
    auto callFunc(F f) {
        std::lock_guard<std::mutex> lock(m);
        return f(t);
    }

private:
    T          t;
    std::mutex m;
};  

Чем код Херба Саттерса лучше моего?

1 Ответ

3 голосов
/ 04 марта 2020

Каким образом код Херба Саттерса лучше моего?

  • Ваш T должен быть конструируемым по умолчанию и назначаться.
  • В коде Херба Саттерса T должен быть копируемым.

  • Код Херба Саттерса позволяет инициализировать элемент.

  • Ваш operator () не обрабатывает ссылку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...