2016-03-07 123 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