我正在尝试使用专门的模板功能制作简单的DI,如下所示:
#include <iostream>
template<typename T>
T inject();
template<>
int inject() {
std::cout << "injected int" << std::endl;
return 123;
}
class Test {
public:
Test(int arg) {
std::cout << arg << std::endl;
}
};
template<typename C, typename... Args>
C* instantiate() {
return new C(inject<Args>()...);
}
int main() {
auto test = instantiate<Test>();
return 0;
}
显然,它不起作用。是否可以像这样扣除可变参数Args
并为每个变量调用instantiate
,然后将结果传递给给定类型C
的构造函数?
您的方法没什么特别的:
template<typename T>
auto inject( )
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
return T();
}
class Test {
public:
template < typename ... T>
Test(T ... arg)
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};
template<typename C, typename... Args>
C* instantiate(Args ... args)
{
return new C(inject<Args>()...);
}
int main()
{
auto test = instantiate<Test>(1,"Hallo", 2.2);
return 0;
}
您的给定代码只有一些小语法问题,因为您没有从inject
返回任何值,仅提供了一个int
参数。如果使用可变参数模板启用所有代码,则可以通过注入传递所有类型的参数,并使用您的C
函数的返回类型创建inject
的实例。
以上代码输出:
auto inject() [with T = int]
auto inject() [with T = const char*]
auto inject() [with T = double]
Test::Test(T ...) [with T = {int, const char*, double}]