如何实现支持模板协方差的通用工厂
How to implement a generic Factory that supports template covariance?
如何在C++14中实现支持模板协方差的通用工厂?
我想实现这样的目标:
std::shared_ptr<Factory<BaseClass>> factory =
std::make_shared<Factory<DerivedClass>>();
auto x = factory->create(arg1, arg2, arg3);
请注意,在factory->create
中,您可以将任何参数传递给DerivedClass
构造函数。可以假设BaseClass
构造函数和DerivedClass
是相同的。
为了避免XY问题,我之所以需要这样做,是因为我想使用依赖注入(boost::di)来实现最大的可测试性。
例如,如果有一个类A
创建Socket
实例,我希望它依赖于Factory<ISocket>
服务。在实际代码中,我会注入Factory<Socket>
,在测试代码中,注入Factory<Mock<ISocket>>
,这样我就可以在不创建实际套接字的情况下测试A
类。
这是我当前的尝试:
template <typename T>
struct BaseFactory {
virtual std::unique_ptr<T> create() = 0;
};
template <typename TInterface, typename TImplementation>
struct Factory : public BaseFactory<TInterface> {
virtual std::unique_ptr<TInterface> create() override {
return std::make_unique<TImplementation>();
}
};
目前的用法类似于:
std::shared_ptr<BaseFactory<ISocket>> factory =
std::make_shared<Factory<ISocket, Socket>>();
auto x = factory->create();
虽然不理想(您需要在Factory
中指定基类),但这种用法对我来说很好,而且很有效。
接下来我需要添加的是对构造函数参数的支持。我已经尝试将可变模板添加到create
:
template <typename ...TArgs>
virtual std::unique_ptr<T> create() = 0;
但是看起来不可能有带模板的虚拟方法。
- 我的方向对吗
- 如果是,我应该如何在实现中添加对构造函数参数的支持
谢谢!
好吧,我找到了一个解决方案,但并不漂亮:
template <typename T, typename ...TArgs>
struct BaseFactory {
virtual std::unique_ptr<T> create(TArgs&&... args) = 0;
};
template <typename TInterface, typename TImplementation, typename ...TArgs>
struct Factory : public BaseFactory<TInterface, TArgs...> {
virtual std::unique_ptr<TInterface> create(TArgs&&... args) override {
return std::make_unique<TImplementation>(std::forward<TArgs>(args)...);
}
};
using ISocketFactory = BaseFactory<ISocket, int>;
using SocketFactory = Factory<ISocket, Socket, int>;
int main() {
std::shared_ptr<ISocketFactory> socket_factory =
std::make_shared<SocketFactory>();
std::unique_ptr<ISocket> socket = socket_factory->create(1234);
socket->read();
socket->write();
}
其思想是在BaseFactory
和Factory
模板中传递实现类的构造函数参数。在这种情况下,Socket
构造函数应该看起来像:
Socket(int n);
你知道如何优化这个吗?(较少样板代码)
以下是boost::di:的解决方案
http://boost-experimental.github.io/di/extensions/index.html#factory
相关文章:
- 为什么是谷神星协方差.计算()似乎永远运行而不返回?
- 为什么需要返回指针来利用协方差?
- Eigen对修复非正定义的协方差矩阵有解吗
- 回调参数中的协方差C++
- 获取长双精度向量的方差
- 我在计算 4 个值的方差时的错误在哪里
- C++容器、协方差和模板
- "shared_ptr"如何实现协方差?
- C++协方差返回类型的缺点是什么
- 我遇到了一个关于多线程的小问题.需要多线程来计算 Pi 和方差
- 如何在犰狳中使用变量/方差函数
- 用c++计算平均值和方差
- 如何实现支持模板协方差的通用工厂
- C 协方差意外行为
- 练习:使用数组计算方差
- 带有指针返回问题的c++协方差问题
- 计算OpenCV中的协方差
- 使用 OpenCV 计算协方差矩阵
- C++类设计:协方差
- 逆方差的常见编程用法是什么?