簡體   English   中英

以可變參數為模板的類:在沒有專門針對整個類的情況下支持void?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM