使用std :: initializer_list创建指向std :: min的函数指针

时间:2016-03-07 19:03:34

标签: c++ templates c++11 stl function-pointers

我想创建一个函数指针并在构造函数中初始化它。

如果type_为Min,则找到任何输入的最小值。

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

我写下以下代码,但它不会在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 ++机制有更优雅的解决方案。 很高兴看到这个!

1 个答案:

答案 0 :(得分:0)

以下是C ++ 14中std::min的重载:

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>)