Map.emplace с несколькими аргументами C++ 17

Использование C++ 17: наличие

using working_t = bool;
std::map<std::thread, working_t> _pool;

Я пытаюсь добавить новую ветку к этой карте, но не могу найти подходящего синтаксиса ..

class ThreadPool {
   std::map<std::thread, working_t> _pool;

   void init() {
      _pool.emplace(&ThreadPool::thread_init, this, false);
   }
   void thread_init();
};

Это должно добавить поток к карте со значением false, но он не может компилироваться .. Возможно ли это?

Вы получаете конкретную ошибку компилятора? Наверное по поводу копирования std::thread?

Drew Dormann 02.05.2018 16:45

Я использую emplace, чтобы избежать копий. Emplace должен создавать типы с заданными аргументами

Mr Smith 02.05.2018 16:46

Нужен ли вам знак равенства между init() и {?

Code Gorilla 02.05.2018 16:46

тип промаха, фиксированный

Mr Smith 02.05.2018 16:47

Какой у вас вариант использования для поиска цепочки на карте? У вас никогда не может быть другого экземпляра этого потока.

cisnjxqu 02.05.2018 16:50
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
179
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Тебе нужно:

_pool.emplace(
    std::piecewise_construct,
    std::forward_as_tuple(&ThreadPool::thread_init, this),
    std::forward_as_tuple(false)
);

... чтобы различать списки аргументов для ключа и значения. Однако тогда вы столкнетесь с проблемой, что у std::thread нет operator <, но это уже другой вопрос :)

зачем нужен оператор <при установке?

Mr Smith 02.05.2018 16:50

@MrSmith он нужен более или менее всегда, поскольку std::map - это заказанный контейнер. Я также ожидаю проблем с постоянством ключа (можно ли вообще использовать const std::thread?), Так что, возможно, карта здесь не тот контейнер.

Quentin 02.05.2018 16:51

@MrSmith, потому что ключи в std::map отсортированы

Slava 02.05.2018 16:52

@MrSmith не особо разбирается в размещении, но карты - это отсортированные контейнеры, поэтому ключи должны иметь <

463035818_is_not_a_number 02.05.2018 16:52

Понятно .. Я хотел сохранить состояние потока, поэтому я создам карту с идентификатором потока и его состоянием ..

Mr Smith 02.05.2018 16:54

@MrSmith, могу я предложить два std::vector<std::thread>, один для активных потоков, а другой для неактивных?

Quentin 02.05.2018 16:56

@QUentin idk .. это может стоить во время выполнения

Mr Smith 02.05.2018 16:59

@MrSmith std::thread не имеет ни std::hash, ни operator ==, так что и std::unordered_map тоже (если, конечно, вы не реализуете свой собственный компаратор и хешер). Я не думаю, что решение с двумя векторами будет иметь какое-либо измеримое влияние на производительность.

Quentin 02.05.2018 17:14

@MrSmith Если вы просто хотите просто сохранить состояние потока, наличие карты идентификатора потока для состояния действительно звучит как хорошая идея. Однако остается вопрос, как вы будете хранить свои потоки в пуле потоков.

Max Langhof 02.05.2018 17:35

Другие вопросы по теме