簡體   English   中英

const 和非常量參數 function 具有單一定義的重載

[英]const and non-const parameter function overloads with a single definition

我有以下 2 function 重載:

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 和非常量引用。 我需要兩個重載的原因是F function object 將應用於向量,有時F會修改向量,有時它只會觀察向量(我想在第二種情況下允許將向量聲明為const ) .

我想我可以使用 C++20 概念來約束 function 模板參數,但我想知道是否有一種簡單的方法可以使用 C++17 或標准的早期版本來實現相同的目的。

你不需要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>>

我找到了另一個解決方案,但它仍然增加了一些開銷:

template<typename F, typename VecT>
auto func_vec(F f, VecT& vec)
{
  //actual code
}

template<typename F, typename T>
auto func(F f, std::vector<T>& vec) { return func_vec(f, vec); }

template<typename F, typename T>
auto func(F f, const std::vector<T>& vec) { return func_vec(f, vec); }

定義了第三個 function ( func_vec ),它包含func的實際實現。

請注意, typename VecT可以接受const和非const arguments。

func重載僅用於將參數約束為帶有或不帶有const限定符的std::vector<T>&類型。

這個解決方案的好處是它不使用 SFINAE,而且相當容易閱讀。 不好的是你必須引入另一個 function 模板用於實際實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM