【发布时间】:2018-04-14 00:42:16
【问题描述】:
我正在使用 Visual Studio 17.7 预览版 3,包括 Boost 1.67.0b1。
我是使用enable_if 的老手,但今天我尝试使用新的做事方式——一个虚拟的额外模板参数。
Boost.Range 不提供“这是一个范围”检查,所以我使用range_value<X>::value,因为如果指定类型不是范围,则依赖类型不存在。这正是 SFINAE 的意义所在!当我给它一个 double 时,模板无法解析声明,所以它应该退出重载集而没有错误。
#include <boost/range/value_type.hpp>
class Fizzer_t {
public:
using itemdef_t = std::pair<int, std::string_view>;
private:
std::vector<itemdef_t> playdef;
public:
template<typename R,
typename = typename boost::range_value<R>::type> // only call if R is a "range"
Fizzer_t (const R & range_of_itemdefs);
Fizzer_t (double); // dummy
};
void play2 {
Fizzer_t player3{ 3.14 };
}
当我给它一个有效参数时,它会编译。
当我给它一个double,而不是匹配另一个构造函数时,它会抱怨
'type': 不是'boost::range_iterator'的成员
这绝对是不是 SFINAE。
我在这里错过了什么?
【问题讨论】:
-
这里有一个类似的问题:stackoverflow.com/q/19516159/2640636
标签: templates visual-c++ c++17 sfinae