Этот статья описывает способ в 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 <>.
На простом C это невозможно, насколько мне известно.
Это легко сделать на C++ с помощью шаблонов:
template <typename T>
T Add(T val1, T val2)
{
return val1 + val2;
}Обратите внимание, однако, что этот должен должен быть определен в файле заголовка, и вы, вероятно, также захотите передать параметры по константной ссылке, а не по значению.
Это вообще невозможно сделать на простом Си.
В C++ это просто не проблема. Код, как в вашем первом примере, работает, если буквально переведен на C++ (ETA: как это сделал Питер), но я не могу придумать ни одной ситуации, когда прямое использование + не сработало бы. Вы ищете решение проблемы, которой не существует.
Шаблоны на C++. В C не обошлось и без больших хлопот и накладных расходов.
template<typename T>
T add(T x, T y)
{
return x + y;
}
Это также можно сделать на C, хотя я не уверен, что это соответствует требованиям проблемы, с помощью макроса.
#define ADD(A,B) (A+B)
НЕТ!!!! Не делай этого. В макросах всегда заключайте параметры в круглые скобки. #Define SQUARE (A) ((A) * (A)) vs #define SQUARE (A) (A * A) даст вам очень разные результаты для SQUARE (x + y)
Стоит отметить, что то, как это работает с шаблонами C++, было названо типами «утиный ввод». В основном вы уклоняетесь от того, какой тип вы действительно хотите, и вместо этого говорите: «он должен поддерживать методы и операции X, Y и т. д.». Он также используется в качестве механизма первичного типа в рубине.