gpt4 book ai didi

C++ 是否可以构建模板类型列表?

转载 作者:太空狗 更新时间:2023-10-29 20:19:45 25 4
gpt4 key购买 nike

所以我不知道这是否可行,但我有一个看起来有点像的设置:

template <class T>
struct Something;

struct Example {
//not sure how this should be defined
//I was thinking void*, but I can't use pointers as the 'Something' class moves around the instances
//and I don't want to have to constantly update the pointers.
std::vector<?> addedTypes;

template<typename T>
void addThing() {
addedTypes.push_back(T);
Something<T>::addThing(*this);
}

void destroy() {
for (auto T : addedTypes) {
Something<T>::removeThing(*this);
}
}
};

template <class T>
struct Something {
static void addThing(Example e) {/*...*/}
static void removeThing(Example e) {/*...*/}
};

基本上我想知道如何制作已添加到循环中的类型列表,以便稍后我可以调用静态删除函数?

编辑:根据评论的建议添加更多信息。

这只是一个例子,它实际上是一个实体组件系统,其中“Example”是一个实体,“Something”是一个CRTP组件。除了 ID 和实体中的一些辅助函数外,所有逻辑都存储在组件中。唯一缺少的部分是从实体中销毁组件(各种类型)的方法(我已经可以从组件中执行此操作,但没有类型,我不确定如何从实体中进行此操作。

至于在“Something”类中调用静态函数的原因,它们与其他静态类成员(例如 std::vector<T> list)交互,并且不触及实例化成员状态。

最佳答案

它不是构建类型列表,而是提供“移除器”列表。

我在这里使用 std::function,也许创建 IRemover 对你来说更有意义(或者简单的函数指针就足够了):

template <class T>
struct Something;

struct Example {
std::vector<std::function<void(Example&)>> removers;

template<typename T>
void addThing() {
removers.push_back(&Something<T>::removeThing);
Something<T>::addThing(*this);
}

void destroy() {
for (auto& f : removers) {
f(*this);
}
removers.clear();
}
};

关于C++ 是否可以构建模板类型列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56750706/

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