2008-10-21 5 views
5

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

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

Этот код не компилируется, поскольку нет никакой гарантии, что тип Т имеет определение оператора «+», но эффект достигается с помощью кода, как это:

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 Марк Гравелл сделал utility library, который очень удобно решает проблему оператора.

ответ

13

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

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

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

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

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

+1

Стоит отметить, что способ, которым это работает с шаблонами C++, был назван «утиным типом» типов. В основном вы уклоняетесь от того, какой тип вы действительно хотите, и вместо этого говорите: «ему нужно поддерживать методы и операции X, Y и т. Д.». Он также используется в качестве механизма первичного типа в рубине. – workmad3 2008-10-21 14:15:59

1

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


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

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

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

4

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

0

Шаблоны в C++. В C, не без массивных хлопот и над головой.

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

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

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

НЕТ !!!! Не делай этого. В макросах всегда включайте параметры в круглые скобки #define SQUARE (A) ((A) * (A)) vs #define SQUARE (A) (A * A) даст вам очень разные результаты для SQUARE (x + y) – 2008-10-21 14:18:45

Смежные вопросы