Вы можете приблизить sizeof(bitset<N>)
как:
4 * ((N + 31) / 32)
8 * ((N + 63) / 64)
Кажется, что первое верно: 4 * ((3 + 31) / 32)
- 4
С помощью:
template <typename R, typename... Ts>
void pushNew(Ts&&... args) {
push(new (*this) R(std::forward<Ts>(args)...));
}
Вы можете написать:
executor.PushNew<MyRunnable>("Hello", 123);
вместо
executer.push(new (executer) MyRunnable("Hello", 123));
В этом есть две вещи:
template <typename R> // this don't works
void pushNew(R) {
push(new (*this) R);
}
На первый ответ отвечает Jarod42 в том, что вы хотите сделать:
template <typename R, typename... Ts>
void pushNew(Ts&&... args) {
push(new (*this) R(std::forward<Ts>(args)...));
}
, но что еще более важно ... new (*this) R
является действительно причудливым . Похоже, вы строите R
над собой! Но это не так, вы просто используете этот синтаксис для вызова своего распределителя. Это ужасно нарушает принцип наименьшего удивления. Мне потребовалось довольно много времени, чтобы понять, что происходит.
То, что вы должны, просто использует ваш распределитель напрямую:
template <typename R, typename... Ts>
void pushNew(Ts&&... args) {
void* slot = allocateEntry(sizeof(R));
push(new (slot) R(std::forward<Ts>(args)...));
}
Это намного легче понять.