![](/img/trans.png)
[英]MSVC: inference of pointer to member function with const and non-const overloads
[英]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.