Pergunta

Este artigo descreve uma maneira, em C #, para permitir a adição de tipos de valor arbitrárias que têm um operador + definida por eles. Na essência, ele permite que o código a seguir:

public T Add(T val1, T val2)
{
   return val1 + val2;
}

Este código não compila porque não há nenhuma garantia de que o tipo T tem uma definição para o operador '+', mas o efeito é conseguido com um código como este:

public T Add(T val1, T val2)
{
   //Num<T> defines a '+' operation which returns a value of type T
   return (new Num<T>(val1) + new Num<T>(val2));
}

Siga o link para ver como a classe Num consegue isso. De qualquer forma, para a questão. Existe alguma maneira de conseguir o mesmo efeito em C ou C ++? Para os curiosos, o problema que estou tentando resolver é permitir que um kernel CUDA para ser mais flexível / geral, que lhe permite operar em mais tipos.

Update: Para .NET, Marc Gravell fez uma biblioteca de utilitários que resolve o problema operador muito elegantemente.

Foi útil?

Solução

Devido à forma como os modelos são compilados em C ++, simplesmente fazendo:

template < class T >
T add(T const & val1, T const & val2)
{
    return val1 + val2;
}

vai funcionar, você receberá um erro de compilação para cada tipo em que um operador + não está definido.

modelos C ++ gerar código para cada tipo instanciação, então para cada código de T tipo será gerado que faz a coisa certa. Desta forma, C ++ não precisa Num <> artifícios.

Em C simples, isso não é possível, tanto quanto eu sei.

Outras dicas

Em C ++ isso simplesmente não é um problema O código como em seus primeiros trabalhos de amostra, se traduzido literalmente em C ++ (ETA: assim como Pieter)., Mas eu não consigo pensar em qualquer situação onde diretamente usando + não iria funcionar. Você está procurando uma solução para um problema que não existe.

Isso pode facilmente ser feito em C ++ usando modelos:


template <typename T>
T Add(T val1, T val2)
{
  return val1 + val2;
}

Note, no entanto, que este deve ser definido em um arquivo de cabeçalho, e você provavelmente também quer passar os parâmetros por referência const em vez de por valor.

Isto não pode ser feito em C simples em tudo.

Pode ser feito em C, bem como, embora eu não tenho certeza que ele atende aos requisitos de problema, com uma macro.

#define ADD(A,B) (A+B)

Templates em C ++. Em C, não sem confusão enorme e despesas gerais.

template<typename T> 
T add(T x, T y)
{ 
    return x + y;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top