gpt4 book ai didi

c++ - 类是否可以公开参数包?

转载 作者:行者123 更新时间:2023-11-30 03:42:04 25 4
gpt4 key购买 nike

我做了一个工厂“M”。我需要构建一个类“C”。包含我的类“M”的开发人员希望能够调用“M::getInst()”,并拥有一个正确构造的“C”实例。

此外,我希望“C”的编写者能够与我们一起工作,除了提供一个公共(public)构造函数和一个告诉我的类“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>();

这样做的原因是,“C”是由一组固定组件类型的组件构建而成的。我的类(class)“M”是如何初始化它们的权威。所以有道理的是,每次开发人员想要创建一种新的 C 语言时,为什么要重新发明所有现有的轮子?他们应该只告诉“M”他们需要什么组件。但是该怎么做呢?

最佳答案

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();
}
};

Live demo .

关于c++ - 类是否可以公开参数包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37017518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com