C ++ 11 std :: encaminhar um ponteiro

eu tenho umSignal classe no meu aplicativo que fornece classes com uma opção para expor eventos (o mesmo que no .NET).

A turma funciona e está tudo bem.

Ontem eu viesta pergunta SO (e sua resposta) e estava familiarizado comstd::forward.

Eu decidi tentar usá-lo no meu código, então eu mudei a cadastd::function<void(Args...)> parastd::function<void(Args&&...)> e na função de aumento (ooperator()) Usei a mesma lógica que vi no link acima, agora a função levaArgs&&...args e o retorno de chamada usastd::forward<Args>(args)...

Aqui está uma versão simplificada da minha classe Signal (com algumas alterações para torná-lo um bom exemplo):

template<typename... Args> class Signal
{
public:
    int operator+=(const std::function<void(Args&&...)>& func)  {
        int token = getNewToken();
        m_subscribers.emplace(token, func);
        return token;
    }

    void operator()(Args&&... args) {
        for (auto it : m_subscribers) {
            it.second(std::forward<Args>(args)...);
        }
    }

private:
    std::map<int, std::function<void(Args&&...)>> m_subscribers;
};

int main() {
    int* six = new int(6);
    int seven = 7;

    Signal<int*> e1;
    e1 += [](int* x) { std::cout << *x; };

    Signal<int> e2;
    e2 += [](int x) { std::cout << x; };

    e1(&seven);
    e2(6);

    e1(six);  //Error C2664 'void Signal<int *>::operator ()(int *&&)': 
              //  cannot convert argument 1 from 'int *' to 'int *&&'
    e1(std::move(six)); //This is a workaround          
    return 0;
}

O problema que estou vendo é com classes (oumain neste exemplo) que tentam gerar eventos com ponteiros e não sei como resolver isso.

Meu principal objetivo é ter a classe Signal uma API geral e se os desenvolvedores escolherem usarSignal<int*> Eu não quero que ele aumente comstd::move.

O que eu estou fazendo errado aqui?

questionAnswers(2)

yourAnswerToTheQuestion