基于运行时类型实例化构造函数

时间:2015-09-07 18:10:33

标签: c++ templates c++11 variadic-templates

在我的工作场所,我正在开发一种能够在运行时理解类型的产品。已经出现了一个任务,它要求我读取这些类型,并根据调用的构造函数将它们存储到C ++类中。到目前为止,我已经考虑了std::tuple,可变参数模板和std::vector boost::any,我可以想出类似

的内容
class Storage
{
   private:
       std::tuple<int,float,std::string> ti;
   public:
       Storage(....);
       Storage(....);
       ....          // constructors for all the combinations
};

我们有内部API可以告诉我在运行时提供了多少种类型,但是,问题是我不知道将以何种方式提供元素,即它只能是1种类型或更多一个或全部三个等等。

因此我最终得到一个大的开关盒,我检查所有输入的可能性(即1种类型,2种类型和3种类型)。

有什么办法可以解决这个问题吗?通过一些模板元编程魔术,最终我可以摆脱这个大的开关案例,只提供一个构造函数,让编译器根据输入实例化构造函数。

我已经完成thisthis问题,但我无法看到它如何适合我的用例。

1 个答案:

答案 0 :(得分:1)

用心打字。如果它不起作用,我不知道是谁写的。我希望我能正确理解这个问题。

创建一个包含所有三个成员的辅助结构,以及设置相应成员时设置的三个标志,以及设置成员的重载成员函数:

struct Helper
{
    int i;
    bool bi;
    float f;
    bool bf;
    std::string s;
    bool bs;

    void set(int i) { this->i = i; bi = true; }
    void set(float f) { this->f = f; bf = true; }
    void set(std::string s) { this->s = s; bs = true; }
};

制作一个功能模板(实际上是三个这样的模板),最多可以获取3个参数并返回Helper个对象:

template<class P1, class P2, class P3> Helper make(P1 p1, P2 p2, P3 p3)
{
    Helper h;
    h.set(p1);
    h.set(p2);
    h.set(p3);
    return h;
}

template<class P1, class P2> Helper make(P1 p1, P2 p2)
{
    Helper h;
    h.set(p1);
    h.set(p2);
    return h;
}

template<class P1> Helper make(P1 p1)
{
    Helper h;
    h.set(p1);
    return h;
}

您的Storage类应该有一个构造函数,其中一个参数类型为Helper,并且只使用设置了标志的参数。要使用该系统:

Storage storage = make(<any combination of up to 3 params>);