共享的从属对象
Shared subservient object
我有一个模板类Foo
,它有一个方法,barMethod
,需要一个Bar
对象。 我可以根据需要让每个单独的Foo
对象创建Bar
对象,但我不想这样做,因为它会很慢,并且不同的Foo
对象很有可能使用相同的Bar
对象。
鉴于此,我希望有一个具有现有Bar
对象集的BarManager
对象。 然后,Foo
对象可以向它请求Bar
对象,如果已经存在适当的对象,管理器将简单地返回它。 如果没有,经理将创建一个新的并返回它。
在我看来,实施"经理"方法有两个问题。
- 管理器必须是一个全局变量,我宁愿不这样做。
BarManager
和Bar
都是模板类,所以即使我要使管理器成为全局变量/对象,我也不确定它是如何工作的。 我想我可以将全局变量设为 void * 并在取消引用到适当的模板化类时强制转换它,但这似乎真的很丑陋。
必须有一种不那么丑陋的方法(也许使用auto
指针? 这是什么?
编辑:该软件是我(也许还有其他人(稍后将使用的库的一部分,这就是为什么类是模板化的并且模板类型不是先验已知的。 另外,我想让Foo
的用户尽可能简单,所以我不希望调用者必须对BarManager
或Bar
做任何事情(例如,实例化BarManager
并为每个Foo
提供引用(。
如果您:
- 在编译时了解
BarManager
的具体类型。 - 不希望Foo的任何用户知道这种内部机制。
然后,您可以让所有Foo
类将此BarManager
作为static
保存(绝对不是全局变量(
template <typename T>
class Bar{};
template <typename T>
class BarManager;
template <typename T>
class Foo
{
private:
static BarManager<T>& GetBarManager()
{
static BarManager<T> managerInstance;
return managerInstance;
}
public:
void barMethod()
{
auto& bar = GetBarManager().GetBarInstance();
// Do something with `bar`
}
};
template <typename T>
class BarManager
{
public:
Bar<T>& GetBarInstance()
{
// Replace with cacher implementation:
static Bar<T> dud;
return dud;
}
};
int main()
{
Foo<int> foo;
foo.barMethod();
return 0;
}
关于如何引用BarManager
有两种选择:
- 将其作为全局对象/指向
main()
/单例/单状态中的本地对象的全局指针。优点是易于访问。 - 显式传递指向
BarManager
实例的指针/引用。优点是可以有许多BarManager
对象。缺点是必须将额外的参数传递给调用,特别是如果调用链很深和/或必须将指向它的引用/指针存储为成员变量。
所以你需要任何负责构造Foo
的东西,首先构造所有BarManager
,然后将它们传递到构造Foo
。由于我真的不知道具体细节,我不得不把它留给你,但给出一个简单的:template<typename T> struct Bar { using value_type = T; const T _val; };
你的BarManager
骨架可能看起来像这样:
template<typename T>
class BarManager {
vector<shared_ptr<Bar<T>>> _bars;
public:
using value_type = T;
size_t size() { size(_bars); }
shared_ptr<Bar<T>>& get_bar(const T target) {
const auto it = find_if(begin(_bars), end(_bars), [&](const shared_ptr<Bar<T>>& i) { return i->_val == target; });
if(it == end(_bars)) {
_bars.push_back(make_shared<Bar<T>>(target));
return _bars.back();
} else {
return *it;
}
}
};
从那里,您的Foo
可能如下所示:
template<typename T>
class Foo {
shared_ptr<BarManager<T>> _my_manager;
shared_ptr<Bar<T>> _my_bar;
public:
using value_type = T;
Foo(shared_ptr<BarManager<T>>& my_manager) : _my_manager(my_manager) {}
void request_bar(const T& target) { _my_bar = _my_manager->get_bar(target); }
};
相关文章:
- 如何从具有移动语义的类对象中生成共享指针
- 使用共享指针的函数调用,其对象应为 const
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 在共享缓冲区内存中创建 ::std::string 对象
- 如何创建一个共享对象与另一个.所以在Cmake
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- 有没有办法列出所有共享内存对象的名称?
- 共享的从属对象
- 在 Android Studio 中使用 C++ 共享对象时出现问题
- 共享对象、符号、C/C++ 库链接和加载
- ./main:加载共享库时出错:libopencv_highgui.so.4.0:无法打开共享对象文件:没有这样的文件或
- 在 win32 上生成 R 包:无法加载共享对象 (.dll)
- C++对象共享属性 - 使用指针或引用
- 如何测试共享对象/共享库已正确编译
- 创建对象共享指针以共享指针为参数
- 限制C++中虚拟基类的对象共享
- 在Ada95中跨共享库/对象共享数据
- 这种线程间对象共享策略是否合理
- 如何更改对象共享指针指向,而它被其他线程占用
- 初始化仅由一组对象共享的静态变量