As operações em tipos de valores arbitrários
-
03-07-2019 - |
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.
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;
}