对于令人困惑的标题道歉,我无法找到更明确的方式来表达我的问题。我试图使用std :: functions来实现回调。这个想法是映射"动作"功能和提供简单的界面,以跟踪特定动作发生时要调用的功能。
这是我班级的简化版本:
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只有一个模板模板 所以当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;
};
有没有办法实现这个目标?
答案 0 :(得分:-1)
你做不到。在第二个示例中,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;