【发布时间】:2015-02-24 11:51:35
【问题描述】:
我有一个如下所示的类模板:
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 的情况下使其成为基类,从而完全接管编译器的责任保护我免受愚蠢的 constness 错误。
有没有办法将 mutable 数据成员转换为非可变数据成员类的基类?
【问题讨论】:
-
元组和 5 个引用访问器?
-
你可以编写一个包装类模板
mutable_if_nonempty<T>,它提供一个T& get() const;成员函数IFFT是非空的(通过存储一个mutable T t;),否则一个T const& get() const;成员函数(通过继承T)。或者,如果T为空,我认为const_cast<T&>(*this)是安全的,允许在从T继承时实现T& get() const;。
标签: c++ optimization mutable