размерные массивы как типы параметров функций в C ++ - PullRequest
0 голосов
/ 31 октября 2011

Я использую шаблоны для моей структуры, например:

#pragma pack(push, 1)
template <typename T>
struct S
{
   T t;

   inline void Set(const T& val) { t = val; }
}
#pragma pack(pop)

T может быть float, int, short или char [10], char [1] или char [2] (и, желательно, любая длина будет большой).

Хотя вышеприведенное кажется вполне подходящим для целочисленных типов, у меня возникают трудности с реализацией части char [n] в этом:

  1. Мне нужно использовать strncpy или memcpy вместо оператора присваивания
  2. Используя вышеизложенное, компилятор жалуется на сигнатуру (const char [2] & val) и мой вызов через s.Set ("T").
  3. Интерфейс между S с целочисленным и символьным типами должен быть таким же, как и общий код, который их вызывает (и неважно, какого они типа).

Ответы [ 3 ]

4 голосов
/ 31 октября 2011

Вы можете определить шаблон специализаций для T в случае char[10] и т. Д. Остались ли какие-либо проблемы при этом? Но, как уже отмечал Мэт, использование строки является подходом, заслуживающим рассмотрения.

#include <iostream>

#pragma pack(push, 1)
template <typename T>
struct S
{
   T t;

   inline void Set(const T& val) { std::cout << "general\n"; }
};

template <int len>
struct S<char[len]>
{
   char t[len];

   inline void Set(const std::string& val) { std::cout << "specialization\n"; }
};
#pragma pack(pop)

int main() {

    S<int> a;
    a.Set(10);

    S<char[20]> b;
    b.Set("turkey!");

    return 0;
}

http://codepad.org/X8YVuFja выход:

вообще
специализация

2 голосов
/ 31 октября 2011

Ну, частичная специализация может помочь:

template <typename T> struct S
{
  T x;
  void set(const T & y) { x = y; }
};

template <typename T, unsigned int N> struct S<T[N]>
{
  T x[N];
  void set(const T (&y)[N]) { std::copy(y, y + N, x); }
};

Использование:

S<char[10]> b;
char c[10] = "Hello";
b.set(c);
0 голосов
/ 31 октября 2011

У меня отлично работает: http://codepad.org/03FSqZC6

#pragma pack(push, 1)
template <typename T>
struct S
{
   T t;

   inline void Set(const T& val) {}
};
#pragma pack(pop)

int main() {
    typedef char (carray)[10];  //do you have a line like this?
    S<carray> lhs;
    carray rhs = "HELLO";
    lhs.Set(rhs);
    return 0;
}

Скорее всего, ваша проблема вызвана использованием неверного типа массива.См. Мой код для примера правильного определения типа.

РЕДАКТИРОВАТЬ:

Я только что понял, что становится неудобно вызывать Set, если у вас уже есть std::string или динамический массив любогоСортировать.Сделайте шаблон специализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...