我是一家工厂" M"。我需要建立一个班级" C"。包含我的班级' M'的开发人员希望能够调用' M :: getInst()',并且拥有一个正确构造的' C&#39 ;
另外,我想要' C'能够与我们一起工作,除了提供一个公共构造函数之外什么都不做,以及一个告诉我的班级的单一辅助方法' M'如何查找/调用该构造函数。
这可能吗?以下是我原则上要做的事情。问题是我在C ++中没有办法编写方法" types()"。似乎不可能将类型(甚至一个!)作为值返回。
struct C {
String s; Blob b;
C( String a, Blob b ) : s(a), b(b) {}
typelist types() {
return { String, Blob };
}
};
clas M {
template<typename T>
T* getInst() {
return getInst_imp<T::types()>();
};
template<class... Ks>
T* getInst_imp() {
return T( getValue(Ks)... );
}
};
用户将称之为:
C* instance = M::getInst<C>();
原因在于,&#39; C&#39;是由一组固定的组件类型的组件构建的。我的班级&#39; M&#39;是如何初始化它们的权威。所以有意义的是,每当开发人员想要创造一种新的C风格时,为什么要重新发明所有现有的轮子呢?他们应该告诉M&#39;他们需要什么组件。但是怎么做呢?
答案 0 :(得分:1)
您现在可以做的最好的事情是std::tuple
:
using typelist = std::tuple<String, Blob>;
typelist types() {
return typelist(s, b);
}
根据您的工作,可能会更好地作为tuple
引用。
答案 1 :(得分:1)
Eric Niebler suggests类型列表应定义为:
// A class template that is just a list of types:
template <class... T> struct typelist { };
您可以在课程C
上公开:
struct C {
String s;
Blob b;
C( String a, Blob b ) : s(a), b(b) {}
using types = typelist<String, Blob>;
};
然后我们可以借用Eric的Tiny Metaprogramming Library中的一些技术来使用工厂内的类型列表:
template<typename T, typename List>
struct MImpl;
template<typename T, typename ...Ks>
struct MImpl<T, typelist<Ks...>> {
static T getInst() {
return T(getValue<Ks>()...);
}
};
class M {
public:
template<typename T>
T getInst() {
return MImpl<T, typename T::types>::getInst();
}
};