我正在编写一个C ++代码来管理磁盘上某些变量的写入。我已经编写了整个架构,剩下的用户就是填充方法,他指定了如何计算每个变量。为此,我创建了一个模板容器,用户指定变量名称和std :: function来计算变量:
template <typename T> struct Container {
Container<T>(std::string _name, std::function<T()> _f): name(_name), f(_f){
}
std::string name;
std::function<T()> f;
T *var;
void assign(int i){
var[i] = f();
}
}
然后,对于用户需要添加的每个变量,他只需要创建一个新的容器对象。例如:
std::string returnTime(){
// Do stuff and returns time;
return time;
}
Container<std::string>("time",returnTime);
现在我的问题是我需要存储所有类型的容器,所以我想到使用std :: tuple。我的实际代码如下:
Dst.cpp
Dst::registerVariables(){
variables = std::make_tuple
(
Container<unsigned int>("Run", [this](){return ev ? ev -> Run() : -1;}),
Container<unsigned int>("Event", [this](){return ev ? ev -> Event() : -1;}),
Container<unsigned int>("UTime", [this](){return ev ? ev -> UTime() : -1;}),
Container<double>("ThetaS", [this](){return ev ? ev -> fHeader.ThetaS : 0;})
);
}
现在我的实际问题是元组对象的声明&#34;变量&#34;在标题中,因为声明中未知类型。
Dst.hpp
class Dst : public DstAmsBinary{
public:
Dst( std::string _data ) : DstAmsBinary( _data, MAXRAM){
std::cout << "init with #" << data.size() << std::endl;
}
protected:
void registerVariables();
auto variables;
};
我能想到的只是试试&#34;汽车&#34;关键字但当然没有用。
所以我的问题归结为: 如何构建一个超级容器来存储我的模板容器对象的列表,无论它们的模板类型是什么。
将列表存储在元组中可能只是错误的想法。我正在寻找建议(可能使用其他模板容器或使用预处理器宏来计算元组的类型......)
感谢您阅读,如果您已收到此消息的结尾; - )
答案 0 :(得分:1)
处理此问题的方法是让您的Container
类模板从作为接口的基类继承:
template <typename T>
class Container : public Base {
// ....
};
然后,无论何时注册变量,都会根据基本类型注册所有内容:
std::vector<Base> variables;
variables.push_back( Container<unsigned>("Run" , [this](){return ev ? ev -> Run() : -1;} ) );
variables.push_back( Container<unsigned>("Event", [this](){return ev ? ev -> Event() : -1;} ) );
// etc.
您可能需要创建指向这些对象的智能指针,然后根据您的情况将其推回(即如果Base
是一个抽象接口,希望它会是这样)。您还需要考虑通过Base
类允许哪种类型的接口。但这是一种标准的方法,可以在运行时确定异构的对象集合。