第一个模板中的“::type=0”是什么意思?
以下是部分代码?
// Null-delimited strings, and the like.
template < typename CharT,
typename std::enable_if <
std::is_pointer<CharT>::value &&
!std::is_array<CharT>::value &&
std::is_integral<typename std::remove_pointer<CharT>::type>::value &&
sizeof(typename std::remove_pointer<CharT>::type) == 1,
int >::type = 0 >
contiguous_bytes_input_adapter input_adapter(CharT b)
{
auto length = std::strlen(reinterpret_cast<const char*>(b));
const auto* ptr = reinterpret_cast<const char*>(b);
return input_adapter(ptr, ptr + length);
}
template<typename InputType>
JSON_HEDLEY_WARN_UNUSED_RESULT
static basic_json parse(InputType&& i,
const parser_callback_t cb = nullptr,
const bool allow_exceptions = true,
const bool ignore_comments = false)
{
basic_json result;
parser(detail::input_adapter(std::forward<InputType>(i)), cb, allow_exceptions, ignore_comments).parse(true, result);
return result;
}
static const char *g_sJsonTextInput = "{"
" "_nested": {"
" "_bool": false,"
" "_int": 0,"
" "_double": 0,"
" "_string": "foo""
" }"
"}";
parse(g_sJsonTextInput);
我认为“std::enable_if<...>::type”的结果是第一个模板参数,对吗?如果是对的,如何理解“::type = 0”?
请帮忙,谢谢!
回答
typename std::enable_if<...>::type是第二个模板参数的类型。该参数未命名。它有一个默认参数= 0,如果您没有为其指定任何参数(这是这里的意图),则使用该参数。
"std::enable_if<...>::type" 的结果是第一个模板参数
enable_if如果条件为真,则它是第二个参数,如果条件为假,则它是无效类型。无效将触发 SFINAE 并禁用特定CharT类型的此功能。
在现代 C++ 中,您将使用更短的符号:
std::enable_if_t<...>(没有typename和::type)。std::is_..._v<...>(而不是std::is_...<...>::value)。
此外,int =0您应该使用std::nullptr_t =nullptr. 使用int, 用户可以通过向模板传递不同的整数来无意中创建几个不同的模板实例,这是不可能的,std::nullptr_t因为它只有一个可能的值。
或者,如果您使用 C++20,则应使用requires符号。