我有以下 2 個函式多載:
template<typename F, typename T>
void func(F f, std::vector<T>& v) { ... }
template<typename F, typename T>
void func(F f, const std::vector<T>& v) { ... }
兩人的身體是一樣的。是否有一種簡單的方法可以使用單個定義來定義它們以避免使用 C 17 或更早標準的代碼重復?
只是為了澄清一下,我希望根據std::vector零件來約束函式,但我想允許傳遞 const 和非 const 參考。我需要這兩個多載的原因是F函式物件將應用于向量,有時F會修改向量,有時它只會觀察向量(我希望允許const在第二種情況下宣告向量)。
我想我可以使用 C 20 概念來約束函式模板引數,但我想知道是否有一種簡單的方法可以使用 C 17 或更早版本的標準來實作相同的目標。
uj5u.com熱心網友回復:
你不需要require條款來做sfinae,
#include <vector>
#include <type_traits>
template<typename T>
struct is_vector : std::false_type{};
template<typename ...Args>
struct is_vector<std::vector<Args...>> : std::true_type{};
template<
typename F,
typename C,
std::enable_if_t<is_vector<std::remove_cvref_t<C>>::value,std::nullptr_t> = nullptr
>
void func(F f, C&& v) {
// ...
}
*std::remove_cvref_t還是c 20,需要std::remove_cv_t<std::remove_reference_t<T>>在較早的標準中使用
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/532733.html
標籤:C 功能重载
