声明一个模板类型未知的元组

时间:2015-10-16 19:10:14

标签: c++ templates tuples declaration

我正在编写一个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;关键字但当然没有用。

所以我的问题归结为: 如何构建一个超级容器来存储我的模板容器对象的列表,无论它们的模板类型是什么。

将列表存储在元组中可能只是错误的想法。我正在寻找建议(可能使用其他模板容器或使用预处理器宏来计算元组的类型......)

感谢您阅读,如果您已收到此消息的结尾; - )

1 个答案:

答案 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类允许哪种类型的接口。但这是一种标准的方法,可以在运行时确定异构的对象集合。