Selecionando uma função de membro usando condições Enable_If
A tarefa é determinar a invocação de uma função de membro com base em um parâmetro de modelo de classe. O seguinte trecho de código tenta fazer isso:
#include
#include
template
struct Point
{
void MyFunction(typename std::enable_if<:is_same int>::value, T &>::type* = 0)
{
std::cout ::value, float &>::type* = 0)
{
std::cout No entanto, este código falha ao compilar com o erro "nenhum tipo chamado 'type' em 'struct std::enable_if'".
SFINAE em ação
A chave para entender esta questão está no conceito de Falha de Substituição Não é um Erro (SFINAE). Enable_if permite compilação condicional baseada em argumentos de modelo. Neste caso, o argumento do modelo T já é conhecido quando as funções-membro são instanciadas. Portanto, a condição é avaliada no momento da instanciação e a função correspondente é selecionada.
Consertando o código
Para corrigir isso, precisamos introduzir um argumento de modelo fictício que o padrão é T. Isso permite que o mecanismo SFINAE funcione conforme planejado. O código modificado ficaria assim:
template
struct Point
{
template
typename std::enable_if<:is_same int>::value>::type
MyFunction()
{
std::cout
typename std::enable_if<:is_same float>::value>::type
MyFunction()
{
std::cout Prevenindo a especialização explícita de funções de membro
Como apontado por HostileFork, o código original permite a especificação explícita de argumentos de modelo para as funções de membro, o que pode levar a resultados incorretos. Para evitar isso, podemos adicionar um static_assert que verifica se algum argumento do modelo é fornecido. Isso garante que a função de membro correta seja sempre invocada com base no argumento do modelo T. O código modificado seria:
template
struct Point
{
template
typename std::enable_if<:is_same int>::value>::type
MyFunction()
{
static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
std::cout
typename std::enable_if<:is_same float>::value>::type
MyFunction()
{
static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
std::cout
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3