簡體   English   中英

具有可變參數模板的C ++ void參數

[英]C++ void argument with variadic template

我的C ++類中有以下模板:

template <typename ReturnType, typename... Args>
ReturnType run(void* context, const Args&... args) {
  /* Do the actual job. */
}

出於實際原因,我需要將其指定為ReturnType void。 我需要保留args列表,因為它們仍然有用。

我嘗試了以下方法,但均無效:

template <typename... Args>
void run(void* context, const Args&... args) {
  /* Do the actual job. */
}

template <typename ReturnType = void, typename... Args>
void run(void* context, const Args&... args) {
  /* Do the actual job. */
}

所以..在我的示例中用void參數指定的正確方法是什么?

在C ++ 17中,這很簡單:使用if constexpr

template <typename ReturnType, typename... Args>
ReturnType run(void* context, const Args&... args) {
    if constexpr (std::is_void_v<ReturnType>) {
        /* void case */
    } else {
        /* non-void case */
    }
}

在C ++ 17之前,做到這一點的最佳方法是使用標簽分派。 創建一個僅對類型進行編碼的新類模板,以便您可以將其作為參數傳遞:

template <typename T> struct tag { };

template <typename ReturnType, typename... Args>
ReturnType run_impl(tag<ReturnType>, void* context, const Args&... args) {
    /* non-void case */
}

template <typename... Args>
void run_impl(tag<void>, void* context, const Args&... args) {
    /* void case */
}

template <typename ReturnType, typename... Args>
ReturnType run(void* context, const Args&... args) {
    return run_impl(tag<ReturnType>{}, context, args...);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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