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?