我正在開發一個 C 14 專案,我剛剛撰寫了一個帶有引數包的函式。
template <typename... Args>
void func(Args&&... args) {
...
}
args應該只包含intor ,std::string不能是任何其他型別。
有沒有辦法在編譯時進行檢查?也許如下所示?
template <typename... Args, std::enable_if_t<???* = nullptr>
void func(Args&&... args) {
...
}
uj5u.com熱心網友回復:
這在 C 17 中的折疊和 C 20 中的概念變得更好,但是您可以針對int和測驗每個元素std::string。
遞回的第一端是主模板。如果沒有專業匹配,我們是錯誤的。
template <typename... Ts>
struct all_int_or_string : std::false_type {};
遞回的另一端是空包,這是真的。
template <>
all_int_or_string<> : std::true_type {};
如果我們找到int或std::string作為第一個元素,則遞回其余元素
template <typename... Ts>
struct all_int_or_string<int, Ts...> : all_int_or_string<Ts...> {}
template <typename... Ts>
struct all_int_or_string<std::string, Ts...> : all_int_or_string<Ts...> {}
您可能還想去掉限定符。
template <typename T, typename... Ts>
struct all_int_or_string<const T, Ts...> : all_int_or_string<T, Ts...> {}
template <typename T, typename... Ts>
struct all_int_or_string<volatile T, Ts...> : all_int_or_string<T, Ts...> {}
template <typename T, typename... Ts>
struct all_int_or_string<T &, Ts...> : all_int_or_string<T, Ts...> {}
template <typename T, typename... Ts>
struct all_int_or_string<T &&, Ts...> : all_int_or_string<T, Ts...> {}
如此使用
template <typename... Args, std::enable_if_t<all_int_or_string<Args...>::value>* = nullptr>
void func(Args&&... args) {
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/472201.html
