模板中的`class =`是什么意思?

时间:2014-05-19 01:08:20

标签: c++ templates

我在C代码中找到了这个构造:

template<typename T, class = decltype(std::declval<T>() < std::declval<T>())>
struct check : std::true_type {};

现在我明白它的作用,但我不明白它是如何工作的。如果类型T不支持< - 运算符,则会引发编译错误。但是,显然,当将class更改为其他内容时,整个事情将无法编译并抛出语法错误。

class = sometypename是什么意思?

2 个答案:

答案 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