У меня есть шаблон класса, который выглядит так:
template<typename T, typename Mutex, typename SomePolicy>
class my_class {
public:
T f() const {
resource_lock a_lock(some_mutex);
return some_policy.some_operation(some_data);
}
private:
T some_data;
mutable Mutex some_mutex;
SomePolicy some_policy;
};
Если не использовать одновременно, у нас есть фиктивный тип мьютекса, который имеет все функции-члены как встроенные пустые функции и никаких данных. Существуют политики, которые имеют данные для каждого экземпляра и те, у которых нет данных.
Это код библиотеки, и оказывается, что этот шаблон шаблона используется в коде приложения, где важны дополнительные байты, которые необходимы для членов данных some_mutex
и some_policy
, даже когда они являются пустыми классами. Поэтому я хочу использовать пустую оптимизацию базы. Для политики это легко:
template<typename T, typename Mutex, typename SomePolicy>
class my_class {
public:
T f() const {
resource_lock a_lock(the_data.some_mutex);
return the_data.some_operation(the_data.some_data);
}
private:
struct data : SomePolicy {
T some_data;
mutable Mutex some_mutex;
};
data the_data;
};
Однако, учитывая, что some_mutex
является mutable
, я не знаю, как сделать его базовым классом, не делая the_data
, и, следовательно, все данные mutable
, тем самым полностью перехватывая ответственность компилятора за защитите меня от глупых ошибок.
Есть ли способ превратить элемент данных mutable
в базу неперемещаемого класса элементов данных?