gpt4 book ai didi

c++ - 在 C++ 中编译时间映射 "search"

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:11:31 26 4
gpt4 key购买 nike

我有下一个简化的回调映射。如果代码包含一些错误,请原谅,但它是能够在此处重现的实际代码的非常简化版本。

struct CallbacksMap
{
template<typename T, typename U>
void Add(T* obj, void (T::*objCallback)(const U&))
{
CallbackBaseType* c = new CallbackType<T, U>(obj, objCallback);
_callbacks[std::type_index(typeid(U))].push_back(std::unique_ptr<CallbackBaseType>(c));
}

template<typename T>
void Remove(T* obj){...}

template<typename T>
void Call(const T& param)
{
std::vector<std::unique_ptr<T>>& callbacks = _callbacks[std::type_index(typeid(T))];
for(auto callback = callbacks.begin(); callback != callbacks.end(); ++callback)
{
(*callback)->Call(&param);
}
}

std::map<std::type_index, std::vector<std::unique_ptr<CallbackBaseType>>> _callbacks;
};

在此示例中,我可以通过调用 Call(param) 成员函数来调用具有相同参数类型的所有函数。我的问题是 _callbacks 中的搜索是在运行时完成的,即使 key 在编译时已知。

我不能根据类型的 type_index 使回调列表静态地局部于模板函数,因为我需要跟踪 Remove(T* obj) 函数的所有对象。

你知道我怎样才能使内部结构能够避免这种运行时开销吗?

最佳答案

您可以使 CallbacksMap 成为模板:

template<typename T>
struct CallbacksMap
{
template<typename U>
static void Add(T* obj, void (T::*objCallback)(const U&))
{
CallbackBaseType* c = new CallbackType<T, U>(obj, objCallback);
auto& callbacks = callbacks();
callbacks.push_back(std::unique_ptr<CallbackBaseType>(c));
}

static void Remove(T* obj){...}

static void Call(const T& param)
{
auto& callbacks = callbacks();
for(auto callback = callbacks.begin(); callback != callbacks.end(); ++callback)
{
(*callback)->Call(&param);
}
}

private:
std::vector<std::unique_ptr<CallbackBaseType>& callbacks()
{
static std::vector<std::unique_ptr<CallbackBaseType> _callbacks;
return _callbacks;
}
};

通过这种方式,类型查找由编译器完成。当然,这意味着您必须使用类似的方式调用不同的回调:

template <typename T>
void CallCallbacks(const T& param)
{
CallbacksMap<T>(param);
}

CallCallbacks(param);

关于c++ - 在 C++ 中编译时间映射 "search",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15573089/

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