我不知道这个问题的标题应该怎么说。。。
我有这样一门课:
class HasFuncBase
{
public:
virtual int GetKey() = 0;
};
template<class... Cs>
class HasFunc : public HasFuncBase
{
public:
typedef std::function<void(std::vector<Cs>&....)> Func;
HasFunc(Func func)
:
m_func(func)
{}
virtual int GetKey() { return id; }
private:
Func m_func;
static int id;
};
template<class... Cs>
int HasFunc::id = unique_key_generator<Cs...>::GetKey();
我跳过了
unique_key_generator
为简洁起见。
然后,另一个类保存上面m\u func的“数据”:
class HasData
{
public:
std::vector<std::vector<char>> data;
int someId;
}
数据向量中的每个元素都是HasFunc类的数据字节。
另一个班级负责管理整个课程:
class Manager
{
public:
std::vector<HasData> m_hadDatas;
std::vector<HasFuncBase*> m_hasFuncs;
};
现在,Manager类需要找到匹配数据的匹配funct并调用它们。真正重要的是它将数据作为引用传递,以便
HasFunc
将对存储在
HasData
.
class Manager
...
void CallFuncs()
{
for(HasFuncBase* f : m_hasFuncs)
{
for(HasData& d : m_hasDatas)
{
if(d.someId == f->GetKey())
{
/*
I need to convert the vector of data vectors
in the HasData into function arguments
of the right type for HasFunc
*/
}
}
}
}
...
我知道我可以向HasFunc类添加模板函数,如:
class HasClass
...
template<typename... Ts>
void Execute(std::vector<Ts>&... dataArrays)
{
m_func(dataArrays);
}
...
在我看来这是一种方式,因为
Manager
不知道混凝土的类型
HasFuncBase
.
我想我需要一些模板解包技巧
HasClass
将从
经理
然后将
vector<data>
数组,在解包后,放入上面的
Execute
功能,但我不知道如何。