我在我的應用程序中有一個Signal
類,它爲類提供了一個公開事件(與.NET相同)的選項。C++ 11 std ::轉發指針
班級運作良好。
昨天我看到this SO question (and its answer)並且熟悉了std::forward
。
我決定嘗試在我的代碼中使用它,所以我改爲每std::function<void(Args...)>
到std::function<void(Args&&...)>
,並在提高功能(operator()
)我使用了我在上面的鏈接看到了同樣的邏輯,所以現在該功能將Args&&...args
和回調使用std::forward<Args>(args)...
這裏是我的信號類的簡化版本(含部分變更,使之成爲很好的例子):
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;
}
我看到的問題是與類(或main
在此示例中)嘗試用普安特來舉辦活動rs和我不知道如何解決這個問題。
我的主要目標是讓Signal類成爲一個通用API,如果開發人員選擇使用Signal<int*>
我不希望他用std::move
加註。
我在做什麼錯在這裏?
@WernerErasmus是的。如果您有多個訂戶,則無法多次轉發相同的參數。 – Barry
感謝Barry,除了'使用F'部分,這是我已經使用的代碼。所以基本上你的答案是「你不能也不應該在這種情況下使用std :: forward」? – ZivS
我更關心如何以及如果我可以使用所有類型的std :: forward。我覺得我應該多讀一些,因爲你的答案的第一段對我來說有點核心...... – ZivS