我想创建一个函数指针并在构造函数中初始化它。
如果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 ++机制有更优雅的解决方案。 很高兴看到这个!
答案 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>)
。