Вопрос

В этой статье описано, как 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 Марк Гравелл создал служебная библиотека , которая очень элегантно решает проблему операторов.

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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


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

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

Этого нельзя сделать в простом C вообще.

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

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

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

template<typename T> 
T add(T x, T y)
{ 
    return x + y;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top