通过参数启用时 std::enabled_if 如何工作
How does std::enabled_if work when enabling via a parameter
我正在尝试了解 enable_if 的工作原理,并且我了解几乎所有内容,但
中的场景 #3 除外
https://en.cppreference.com/w/cpp/types/enable_if
template<class T>
void destroy(T* t,
typename
std::enable_if<std::is_trivially_destructible<T>::value>::type* = 0)
{
std::cout << "destroying trivially destructible T\n";
}
如果 enable_if 中的表达式为真,则选择部分模板特化,因此如果选择:
- 为什么在 enable_if 中只是条件而不指示第二个模板参数?
- 那么"type*"是什么类型呢?空白* ?如果是,为什么?
- 为什么是指针?
why in enable_if is only condition without indicating second template
parameter ?
因为默认的void
就可以了。
What type is "type*" then ? void* ? if so, why ?
是的,如果 std::is_trivially_destructible<T>::value == true
,::type
将是 void
类型,这将导致 ::type*
-> void*
。
Why is it pointer ?
所以我们可以很容易地给它一个默认值0
。
我们使用 std::enable_if
的全部目的是检查某些属性(在这种情况下检查 T
是否可以轻易破坏),如果这些结果是 false
那么我们使用它创建格式错误的代码,从而从重载决议中消除此功能。
如果 std::is_trivially_destructible<T>::value == false
则 ::type
将不存在,因此代码格式不正确。在 SFINAE 中,这很方便,因为此过载将不会被考虑用于解析。
我正在尝试了解 enable_if 的工作原理,并且我了解几乎所有内容,但
中的场景 #3 除外https://en.cppreference.com/w/cpp/types/enable_if
template<class T>
void destroy(T* t,
typename
std::enable_if<std::is_trivially_destructible<T>::value>::type* = 0)
{
std::cout << "destroying trivially destructible T\n";
}
如果 enable_if 中的表达式为真,则选择部分模板特化,因此如果选择:
- 为什么在 enable_if 中只是条件而不指示第二个模板参数?
- 那么"type*"是什么类型呢?空白* ?如果是,为什么?
- 为什么是指针?
why in enable_if is only condition without indicating second template parameter ?
因为默认的void
就可以了。
What type is "type*" then ? void* ? if so, why ?
是的,如果 std::is_trivially_destructible<T>::value == true
,::type
将是 void
类型,这将导致 ::type*
-> void*
。
Why is it pointer ?
所以我们可以很容易地给它一个默认值0
。
我们使用 std::enable_if
的全部目的是检查某些属性(在这种情况下检查 T
是否可以轻易破坏),如果这些结果是 false
那么我们使用它创建格式错误的代码,从而从重载决议中消除此功能。
如果 std::is_trivially_destructible<T>::value == false
则 ::type
将不存在,因此代码格式不正确。在 SFINAE 中,这很方便,因为此过载将不会被考虑用于解析。