2016-03-07 84 views
0

我想做一個函數指針並在構造函數中初始化它。使函數指針std :: min與std :: initializer_list

如果type_是Min,則找到任何輸入的最小值。

如果type_是最大值,找到任何輸入的最大值。

我記下了下面的代碼,但它不會在VS 2014中編譯,C++編譯器版本是MSVC 19.0.23506.0。

uint32_t (*compare) (std::initializer_list<const uint32_t> init_list); 

if (Min == type_) { 
    compare = std::min<std::initializer_list<const uint32_t>>; 
} else if (Max == type_) { 
    compare = std::max<std::initializer_list<const uint32_t>>; 
} 

的錯誤是如下:

error C2563: mismatch in formal parameter list 
error C2568: '=': unable to resolve function overload 
note: could be '_Ty std::min(std::initializer_list<_Elem>,_Pr)' 
note: or  'const _Ty &std::min(const _Ty &,const _Ty &,_Pr)' 
note: or  '_Ty std::min(std::initializer_list<_Elem>)' 
note: or  'const _Ty &std::min(const _Ty &,const _Ty &)' 

這似乎是一個類型不匹配,但我不知道如何解決。

但是,如果您使用現代C++機制有更優雅的解決方案。 高興看到!

+0

您不需要使用'const'類型,initializer_list是不可變的 –

+0

您可能想在最後的'else'情況下將'compare'初始化爲'nullptr'。當我看到像這樣的未初始化變量時,至少我會發癢。 – MSalters

回答

0

下面是std::min重載作爲C++ 14:

template <class T> constexpr const T& min(const T&, const T&); // (1) 
template <class T, class Compare> constexpr const T& min(const T&, const T&, Compare); // (2) 
template <class T> constexpr T min(std::initializer_list<T>); // (3) 
template <class T, class Compare> constexpr T min(std::initializer_list<T>, Compare); // (4) 

在這些中,二隻具有一個單一的模板參數:(1)(它接受兩個const T& S)和(3)(這需要一個std::initializer_list<T> )。你想要的是(3) - 但請注意,它的模板參數是只是T ...不是std::initializer_list<T>。編譯器錯誤是由於您指定了錯誤的模板函數而導致的 - 兩個可能的單模板參數重載都不可分配給compare

所以剛修好你指定的方式:

// not const... just initializer_list<uint32_t> 
uint32_t (*compare) (std::initializer_list<uint32_t>); 

// select the correct overload 
compare = std::min<uint32_t>; 

這工作,因爲同時還有兩個重載命名爲std::min<uint32_t>(1)(3)),只有(3)實際上是轉換爲uint32_t(*)(std::initializer_list<uint32_t>)

+0

該解釋有很大幫助! – Christophe