在我的工作场所,我正在开发一种能够在运行时理解类型的产品。已经出现了一个任务,它要求我读取这些类型,并根据调用的构造函数将它们存储到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种类型)。
有什么办法可以解决这个问题吗?通过一些模板元编程魔术,最终我可以摆脱这个大的开关案例,只提供一个构造函数,让编译器根据输入实例化构造函数。
答案 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>);