![](/img/trans.png)
[英]Deduce types pack from a variadic-templated class and declare an argument of the same types pack
[英]Variadic-templated class: support void without specializing the whole class?
我有一堂課:
template <typename ...Arguments>
class CSignalConnection
{
public:
CSignalConnection(std::function<void(Arguments...)> target) : m_target(target) {}
void invoke(Arguments&&... args) const
{
m_target(std::forward<Arguments>(args)...);
}
private:
std::function<void(Arguments...)> m_target;
};
我希望能夠聲明CSignalConnection<void>
並在不帶參數的情況下調用invoke
。 而且我想避免專門化,即當我只有幾個無效的不兼容方法時(例如,這里應使用0參數聲明的invoke
,復制整個類。 我還有更多這樣的類,所以我不喜歡將所有內容編寫兩次(並在兩個位置進行編輯)。
我的一個想法是同時編寫void和non-void invoke
重載,並使用SFINAE禁用重載,但是我不知道如何實際實現這一點。
使用CSignalConnection<>
將使Arguments
包為空。 以下對我有用
void f() {
std::cout << "hello world\n";
}
int main () { {
CSignalConnection<> cs{&f};
cs.invoke();
}
但是,由於沒有類型推導,這是對轉發的濫用,因此您需要使invoke()
推導其參數的類型,以獲得真實的通用引用(轉發引用)
template <typename ...Arguments>
class CSignalConnection {
public:
template <typename... Ts>
void invoke(Ts&&... args) const
{
m_target(std::forward<Ts>(args)...);
}
//... rest of the class omitted ...
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.