gpt4 book ai didi

c++ - 如何使用可变模板解决这个问题

转载 作者:行者123 更新时间:2023-11-28 00:34:05 26 4
gpt4 key购买 nike

我想写一个 IoC/DI 的东西。我目前想出了以下内容:

#ifndef IOC_H_INCLUDED
#define IOC_H_INCLUDED

#include <unordered_map>
#include <functional>
#include <typeinfo>
#include <string>

namespace IoC
{

class Resolver
{
public:
template <typename Itf, typename Class>
void Register();

template <typename Itf, typename Class, typename Arg1>
void Register();

template <typename T>
T* Create();
private:
std::unordered_map<std::string,std::function<void*()>> m_creationFunctions;
};

template <typename Itf, typename Class>
void Resolver::Register()
{
std::function<void*()> creator = [=](){ return new Class();};
m_creationFunctions[std::string(typeid(Itf).name())]=creator;
}

template <typename Itf, typename Class, typename Arg1>
void Resolver::Register()
{
std::function<void*()> creator = [=](){ return new Class(this->Create<Arg1>());};
m_creationFunctions[std::string(typeid(Itf).name())]=creator;
}

template <typename T>
T* Resolver::Create()
{
return nullptr;
}
}

#endif // IOC_H_INCLUDED

正如您在上面的代码中看到的,我需要一个版本的 Register 用于每个构造函数参数。我如何使用可变参数模板解决此问题,以便代码在编译时扩展?

问候托拜厄斯

P.S.:我知道创建代码本身仍然缺失,而且 IoC-Container 还不存在,但我需要Register 功能才能开始。


这是一个完整的示例(根据答案修改),展示了 IoC 的作用:

http://pastebin.com/mFu5FSTF - 在 Windows 上使用 MingW 编译和运行。

(它应该工作 - 如果它不工作,将它分成 IoC.h 和 main.cpp 文件并删除 include 前面的//)

最佳答案

您的问题可以对正在尝试的内容进行一些澄清(例如,示例使用代码。)但这里有一个快速演示,说明如何以可变方式执行您布置的内容:

// in class definition
template <typename Itf, typename Class, typename ...Args>
void Register();

// in implementation section
template <typename Itf, typename Class, typename ...Args>
void Resolver::Register()
{
std::function<void*()> creator = [=](){ return new Class(this->Create<Args>()...);};
m_creationFunctions[std::string(typeid(Itf).name())]=creator;
}

我在 VC++12 上用下面的代码快速测试了这个,一切看起来都很好:

struct TestStruct {
TestStruct(int * a, int * b, int * c)
: a_(a), b_(b), c_(c) {
}
int * a_;
int * b_;
int * c_;
};

// ...

IoC::Register testRegister;
testRegister.Register<int, TestStruct, int, int, int>();

有点奇怪,您的 Create 返回指针(因此 TestStruct 定义包含一堆指针)而不仅仅是类型,但我不知道这里的完整情况。

关于c++ - 如何使用可变模板解决这个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21634947/

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