detectando typedef em tempo de compilação (metaprogramação de modelos)
Atualmente, estou fazendo uma metaprogramação de modelos. No meu caso, eu posso lidar com qualquer tipo "iterável", ou seja, qualquer tipo para o qual umtypedef foo const_iterator
existe da mesma maneira. Eu estava tentando usar a nova metaprogramação de modelo C ++ 11 para isso, mas não consegui encontrar um método para detectar se um determinado tipo está ausente.
Como também preciso ativar / desativar outras especializações de modelo com base em outras características, atualmente estou usando um modelo com dois parâmetros e o segundo é produzido viastd::enable_if
. Aqui está o que estou fazendo atualmente:
template <typename T, typename Enable = void>
struct Foo{}; // default case is invalid
template <typename T>
struct Foo< T, typename std::enable_if<std::is_fundamental<T>::value>::type>{
void do_stuff(){ ... }
};
template<typename T>
struct exists{
static const bool value = true;
};
template<typename T>
struct Foo<T, typename std::enable_if<exists< typename T::const_iterator >::value >::type> {
void do_stuff(){ ... }
};
Eu não fui capaz de fazer algo assim sem oexists
modelo auxiliar. Por exemplo, simplesmente fazendo
template<typename T>
struct Foo<T, typename T::const_iterator> {
void do_stuff(){ ... }
};
não funcionou, porque nos casos em que essa especialização deve ser usada, o caso padrão inválido foi instanciad
No entanto, não consegui encontrar issoexists
em qualquer lugar do novo padrão C ++ 11, que até onde eu sei simplesmente está retirandoboost::type_traits
para esse tipo de coisa. No entanto, nopagina inicia paraboost::type_traits
não mostra nenhuma referência a qualquer coisa que possa ser usad
ssa funcionalidade está ausente ou ignorei outra maneira óbvia de obter o comportamento desejad