我的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参数指定的正确方法是什么?
答案 0 :(得分:4)
在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...);
}