Корректировка и экспорт символов C ++ => Разрешить дублирование кода? - PullRequest
4 голосов
/ 04 декабря 2010

В нашем проекте у нас есть что-то вроде этого:

struct PointI
{
  // methods for getting, setting and calculating some point stuff
private:
  int x;
  int y;
};

struct PointD
{
  // methods for getting, setting and calculating some point stuff
private:
  double x;
  double y;
};

Я предложил изменить это на что-то вроде этого:

template<typename T>
struct Point
{
  // methods for gettig, setting and calculating some point stuff
private:
  T x;
  T y;
};

typedef Point<int> PointI;
typedef Point<double> PointD;
typedef Point<float> PointF;

Но это было отклонено, и мне сказали: "У этого подхода есть одна проблема - манипулирование и экспорт символов C ++. Шаблоны настолько длинные, когда используются в экспортируемых символах (API, который их использует), и нет способа экспортировать шаблоны ».

Является ли этот аргумент настолько сильным, чтобы допускать много дублирования кода?

Ответы [ 3 ]

4 голосов
/ 04 декабря 2010

Ваш босс (или что-то еще), вероятно, прав.Если вы пишете библиотеку, которую следует использовать на других языках, кроме C ++, то, как правило, рекомендуется писать интерфейс только на языке C.

Конечно, вы все равно можете использовать шаблоны внутри себя, но не подвергайте их воздействию.им.

1 голос
/ 04 декабря 2010

нет способа экспортировать шаблоны

Это верно только для связи C (т. Е. Если вы используете extern "C" при экспорте).Нет технической проблемы при экспорте класса шаблона из разделяемой библиотеки - просто подумайте о классах STL, экспортированных из библиотеки времени выполнения C ++.

Это правда, что из-за искажения имени CPP не стандартизирован, клиент вашегоэкспортируемый класс должен будет использовать тот же компилятор, который вы используете (и часто ту же версию компилятора), но это может быть приемлемо в закрытых средах.Кстати, именно поэтому вам часто приходится устанавливать распространяемые пакеты Microsoft Visual C ++ 200X перед установкой нового программного обеспечения.Распространяемые пакеты MS решают эту проблему специально для библиотек времени выполнения CPP на платформах Windows.

0 голосов
/ 04 декабря 2010

Существуют методы для экспорта шаблонов, если вы используете Visual Studio, вы можете проверить __declspec(dllimport/dllexport), который очень мощный. Я не знаю, предлагают ли другие компиляторы это. Однако, если вы не экспортируете C-совместимый интерфейс, то вы в основном заставляете пользователя использовать тот же компилятор, что и у вас, по крайней мере, того же поставщика, если не точно такую ​​же модель.

...