gpt4 book ai didi

c++ - 推导成员函数和变量的模板参数

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

对于令人困惑的标题,我深表歉意,我找不到更清晰的方式来表达我的问题。我正在尝试使用 std::functions 来实现回调。这个想法是将“ Action ”映射到函数,并提供一个简单的界面来跟踪在某个 Action 发生时调用哪些函数。

这是我的类(class)的简化版本:

template<typename ID, typename Return, typename ...Args>
class A
{
public:
void Register(ID id, std::function<Return(Args...)> funct)
{
m_listeners.emplace(id, funct);
}
A() {}
~A() {}
private:
std::unordered_multimap<ID, std::function<Return(Args...)> > m_listeners;

};

我真正想要的是A只有1个模板模板因此,当 A 被声明时,底层容器仍然可以接受具有任何返回类型和任意数量参数的函数。

我对模板没有太多经验,我什至不确定我正在尝试做的事情是否可行,但我需要从类 A 中隐藏 unordered_multimap 的模板参数。

我正在尝试做的事情看起来像这样:

template<typename ID>
class A
{
public:
template<typename Return, typename ...Args>
void Register(ID id, std::function<Return(Args...)> funct)
{
m_listeners.emplace(id, funct);
}
A() {}
~A() {}
private:
template<typename Return, typename ...Args>
std::unordered_multimap<ID, std::function<Return(Args...)> > m_listeners;
};

有什么办法可以实现吗?

最佳答案

你不能那样做。在您的第二个示例中,Register 方法和容器需要知道回调的返回类型和参数类型。因此,您必须用它来模板化 A。

可以做的是将类签名简化为:

#include <unordered_map>
template<typename ID, typename F>
class A
{
public:
void Register(ID id, std::function<F> funct)
{
m_listeners.emplace(id, funct);
}
A() {}
~A() {}
private:
std::unordered_multimap<ID, std::function<F> > m_listeners;
};
A<int, void(long)> a;

关于c++ - 推导成员函数和变量的模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28922866/

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