Операции с произвольными типами значений - PullRequest
5 голосов
/ 21 октября 2008

В этой статье описан способ добавления в C # произвольных типов значений, для которых для них определен оператор +. По сути это позволяет следующий код:

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

Этот код не компилируется, поскольку нет гарантии, что тип T имеет определение для оператора '+', но эффект достигается с помощью кода, подобного следующему:

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));
}

Перейдите по ссылке, чтобы увидеть, как класс Num достигает этого. В любом случае, к вопросу. Есть ли способ достичь того же эффекта в C или C ++? Для любопытных проблема, которую я пытаюсь решить, состоит в том, чтобы позволить ядру CUDA быть более гибким / общим, позволяя ему работать с большим количеством типов.

Обновление: Для .NET Марк Гравелл создал служебную библиотеку , которая очень элегантно решает проблему оператора.

Ответы [ 5 ]

13 голосов
/ 21 октября 2008

В связи с тем, как шаблоны компилируются в C ++, просто выполните:

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

будет работать, вы получите ошибку компиляции для каждого типа, где оператор + не определен.

Шаблоны C ++ генерируют код для каждого экземпляра типа, поэтому для каждого типа T будет генерироваться код, который делает правильные вещи. Таким образом, C ++ не нуждается в обмане Num <>.

На обычном C, насколько я знаю, это невозможно.

4 голосов
/ 21 октября 2008

В C ++ это просто не проблема. Код, как в вашем первом примере, работает, если буквально переводиться в C ++ (ETA: как это делал Питер), но я не могу представить себе ситуацию, когда напрямую использование + не сработает. Вы ищете решение проблемы, которой не существует.

1 голос
/ 21 октября 2008

Это также может быть сделано в C, хотя я не уверен, что это соответствует требованиям проблемы, с макросом.

#define ADD(A,B) (A+B)
1 голос
/ 21 октября 2008

Это легко сделать в C ++ с помощью шаблонов:


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

Обратите внимание, однако, что это должно быть определено в заголовочном файле, и вы, вероятно, также захотите передать параметры по константной ссылке вместо значения.

Это не может быть сделано в простой C вообще.

0 голосов
/ 21 октября 2008

Шаблоны в C ++. В С не без больших хлопот и накладных расходов.

template<typename T> 
T add(T x, T y)
{ 
    return x + y;
}
...