gpt4 book ai didi

带有可变参数模板的 C++ void 参数

转载 作者:行者123 更新时间:2023-11-30 01:38:37 29 4
gpt4 key购买 nike

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

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

出于实际原因,我需要将 ReturnType 指定为 void。我需要保留参数列表,因为它们仍然有用。

我尝试了以下但都不起作用:

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...);
}

关于带有可变参数模板的 C++ void 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47373354/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com