Pourquoi n'imprime "B"std :: enable_if utilisant son type interne et sans l'utiliser
#include <iostream>
template<typename T, typename U = void>
struct Test
{ static void apply() { std::cout << "A" << std::endl; } };
template<typename T>
struct Test<T, typename std::enable_if<true>::type>
{ static void apply() { std::cout << "B" << std::endl; } };
int main()
{
Test<int>::apply();
}
mais celui-ci "A" ?:
#include <iostream>
template<typename T, typename U = void>
struct Test
{ static void apply() { std::cout << "A" << std::endl; } };
template<typename T>
struct Test<T, std::enable_if<true>>
{ static void apply() { std::cout << "B" << std::endl; } };
int main()
{
Test<int>::apply();
}
La seule différence entre eux est que, dans le premier, j'utilise typename std::enable_it<true>::type
comme U
(par exemple, void
), mais dans la seconde, j'utilise directement std::enable_if<true>
comme U
, qui est également un type bien défini et sans plus de signification que void
.
'std :: enable_if' a beaucoup plus de sens que 'void'. Il est un type qui a un type de membre nommé 'type' qui est égal à' void'. Donc 'void' et' std :: enable_if 'sont deux choses différentes (' void' n'a pas de membre 'type'),' typename std :: enable_if :: type' et 'void' ne le sont pas. –
stefan