gpt4 book ai didi

c++ - 我可以抽象出有关模板类的具体细节吗?

转载 作者:太空狗 更新时间:2023-10-29 21:18:45 26 4
gpt4 key购买 nike

我正致力于在 C++11 中创建一个工厂库(类似于 https://github.com/google/guice,可用于 Java),以熟悉模板编程,并创建一个有用的依赖减少工具。这个想法是工厂将抽象出对象的创建和销毁的细节,并隐藏实现细节。理想情况下,我想要类似于以下内容的内容:

InterfaceClass
{
public:
virtual void doSomething () = 0;
virtual ~InterfaceClass () {};
}

// Might need custom deleter depending on how the class was allocated
// (might come from a pool, etc)
ImplementationClass : public InterfaceClass
{
public:
// Some (possibly) complicated constructor.
ImplementationClass(Dependency one, Other dependency) {}

virtual void doSomething ()
{
// Implementation
}

virtual ~ImplementationClass ()
{

}
}

理想情况下,我希望库的最终用户能够(或类似的东西):

std::unique_ptr<InterfaceClass> object = factory<InterfaceClass>();

如果所有类都使用默认删除器,这会很好用,但在自定义删除器的情况下,unique_ptr 的类型从:

std::unique_ptr<I> 

到:

std::unique_ptr<I, deleter> 

-- 据我所知,这些类型不兼容。

有没有一种方法可以定义某种更高级别的“唯一指针”,它不关心类型签名中的删除器?使 API 对对象的创建/删除不可知的其他可能的解决方法?

谢谢!

最佳答案

使用 std::function拥有一个通用的类型删除删除器。

Ideone link

#include <iostream>
#include <memory>
#include <functional>

template<typename T>
using TypeErasedUPtr = std::unique_ptr<T, std::function<void(T*)>>;

int main()
{
TypeErasedUPtr<int> p1{new int(5), [](int* x){ delete x; }};
TypeErasedUPtr<int> p2{someAllocator<int>(5), [](int* x){ someDeallocator(x); }};

// `p1` and `p2` have the same type, `TypeErasedUPtr<int>`.

return 0;
}

这是有效的,因为 std::unique_ptr<T, TDeleter>接受任何可调用的 TDeleter可以用 T* 调用的类型参数。

std::function<void(T*)>满足该要求,并在运行时以多态方式包装具有该签名的任何类型的函数(通过支付少量运行时开销)。

关于c++ - 我可以抽象出有关模板类的具体细节吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29450140/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com