簡體   English   中英

引用容器的C ++模板專業化

[英]c++ template specialization for container of reference_wrapper

#include "stdafx.h"

#include <algorithm>

class MyClass {
};

template <typename C, typename V, typename Enable = void>
static bool Contains(const C& container, const V& value) {
    auto iter = std::find(container.begin(), container.end(), value);
    auto result = (iter != container.end());
    return result;
}

template <typename C, typename V,
          typename std::enable_if<std::is_same<std::reference_wrapper<const V>, typename C::value_type>::value, bool>::type>
static bool Contains(const C& container, const V& value) {
    auto iter = std::find_if(container.begin(), container.end(), [&](auto& aValue) {
        return (aValue.get() == value);
    });
    auto result = (iter != container.end());
    return result;
}

int main() {
    const MyClass a;
    auto container = {
        std::reference_wrapper<const MyClass>(a),
    };
    Contains(container, a);
    return 0;
}

編譯器:VC ++ 2015U3

編譯錯誤:

嚴重性代碼說明項目文件行抑制狀態錯誤C2678二進制'==':未找到采用'const std :: reference_wrapper'類型的左操作數的運算符(或沒有可接受的轉換)ConsoleApplication1 c:\\ program files x86)\\ Microsoft Visual Studio 14.0 \\ vc \\ include \\ xutility 3258

它運行在第一個實現中,而不是第二個實現中。

有什么想法嗎?

您需要定義operator ==來比較類實例:

bool operator ==(MyClass const & left, MyClass const & right) { return false; }

此運算符將由std::findstd::find_if算法調用(而不是在lambda return (aValue.get() == value);內部return (aValue.get() == value);在第二種情況下)。

也許您還需要MyClassoperator==() ,但是,為了解決專業化問題,我認為最好使用顯式專業化

template <template <typename...> class C, typename V>
static bool Contains (C<std::reference_wrapper<V const>> const & container,
                      V const & value) {
    auto iter = std::find_if(container.begin(), container.end(), [&](auto& aValue) {
        return (aValue.get() == value);
    });
    auto result = (iter != container.end());
    return result;
}

而不是SFINAE。

因為例如,如果您還使SFINAE能夠啟用reference-wrapper-container版本,

template <typename C, typename V> 
static std::enable_if_t<std::is_same<std::reference_wrapper<const V>, 
                        typename C::value_type>::value, bool>
   Contains (const C& container, const V& value)

兩個版本的Contains()函數都匹配該調用

 Contains(container, a);

而且沒有人是首選。

暫無
暫無

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

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