Операции с произвольными типами значений
-
03-07-2019 - |
Вопрос
В этой статье описано, как 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;
}