我有一個問題,我有一個template<typename R, typename... ArgTs>應該有函式的類R call(ArgTs... args)。問題是,我需要一個特殊情況,其中 R 是無效的。我已經嘗試過std::is_same<...>,constexpr但這是不可能的,因為我使用的是 c 11。
在這里,我將問題分解為兩個功能以及我認為它的樣子:
template <typename R, typename... ArgTs>
R call(Callable<R, ArgTs...> *_callback, SemaphoreHandle_t _mutex, ArgTs... args) {
xSemaphoreTakeRecursive(_mutex, portMAX_DELAY);
if (_callback != nullptr) {
if (_callback->isAlive()) {
R returnVal = _callback->call(args...);
xSemaphoreGiveRecursive(_mutex);
return returnVal;
}
}
xSemaphoreGiveRecursive(_mutex);
return (R)0;
}
template <typename... ArgTs>
void call<void, ArgTs...>(Callable<void, ArgTs...> *_callback, SemaphoreHandle_t _mutex,
ArgTs... args) {
xSemaphoreTakeRecursive(_mutex, portMAX_DELAY);
if (_callback != nullptr) {
if (_callback->isAlive()) {
_callback->call(args...);
}
}
xSemaphoreGiveRecursive(_mutex);
}
編譯器給出了這個錯誤:error: non-type partial specialization 'call<void, ArgTs ...>' is not allowed
我理解為什么,因為這兩個模板基本相同,因為它們可以接受任意數量的引數,但是我該如何解決這個問題?
該函式也應該作為方法 ( template class ...) 在類內部,但是使用我撰寫的兩個函式,我只能在類內部構建一個包裝器,以使模板變得更簡單。
uj5u.com熱心網友回復:
函式模板不能部分指定,可以多載。
template <typename R, typename... ArgTs>
typename std::enable_if<!std::is_same<R, void>::value, R>::type
call(Callable<R, ArgTs...> *_callback, SemaphoreHandle_t _mutex, ArgTs... args) {
...
}
template <typename... ArgTs>
void
call(Callable<void, ArgTs...> *_callback, SemaphoreHandle_t _mutex, ArgTs... args) {
...
}
或者,如果您仍然需要R第二個功能模板的模板引數,您也可以添加std::enable_if對它的檢查。
template <typename R, typename... ArgTs>
typename std::enable_if<std::is_same<R, void>::value, R>::type
call(Callable<R, ArgTs...> *_callback, SemaphoreHandle_t _mutex, ArgTs... args) {
...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/440815.html
上一篇:透明地將C 可變引數呼叫引數傳遞給ostream輸出運算子
下一篇:每秒函式呼叫控制率
