我在C代码中找到了这个构造:
template<typename T, class = decltype(std::declval<T>() < std::declval<T>())>
struct check : std::true_type {};
现在我明白它的作用,但我不明白它是如何工作的。如果类型T
不支持<
- 运算符,则会引发编译错误。但是,显然,当将class
更改为其他内容时,整个事情将无法编译并抛出语法错误。
class = sometypename
是什么意思?
答案 0 :(得分:5)
class
与此处typename
相同。你也可以这样做:
template<typename T, typename = decltype(std::declval<T>() < std::declval<T>())>
struct check : std::true_type {};
您可以为模板参数指定默认值。例如
template<typename X = int> struct test { };
如果您不使用模板参数的名称,也可以不使用它们:
template<typename = int> struct test { };
因此,在您的示例中,第二个模板参数只是一个带有默认参数的未命名参数。
答案 1 :(得分:1)
使这项工作的概念称为 SFINAE (替换失败不是错误),用于实现std::enable_if<>
等。http://en.cppreference.com/w/cpp/language/sfinae