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

时间:2015-03-08 03:51:51

标签: c++ templates c++11 variadic-templates std-function

对于令人困惑的标题道歉,我无法找到更明确的方式来表达我的问题。我试图使用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;
};

有没有办法实现这个目标?

1 个答案:

答案 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;