шаблон C ++ массив - PullRequest
       1

шаблон C ++ массив

1 голос
/ 26 апреля 2011

Я хочу определить тип String так, чтобы объявление переменной типа String во время компиляции эквивалентно char [N]. Я видел примеры шаблонных функций определенного размера массива, но ни одного из них для работы с самими конкретными конкретными типами.

namespace myns {

   typedef uint32_t LongCount;
   typedef uint16_t ShortCount;

   typedef uint32_t LongDist;
   typedef uint16_t ShortDist;

   #define LONG_NAME 20;
   #define SHORT_NAME 10;

   // this would be better in my opinion:
   typedef String<20> LongName;
   typedef String<10> ShortName;


template<typename DIST1, typename DIST2, typename COUNT1>
struct SomeStruct1Base
{
   DIST1 dist1;
   DIST2 dist2;
   COUNT1 c;
};

typedef SomeStruct1Base<LongDist, LongDist, LongCount> SomeStruct1Long;
typedef SomeStruct1Base<ShortDist, ShortDist, ShortCount> SomeStruct1Short;

template<typename DIST1, typename COUNT1, int NAME_LEN>
struct SomeStruct2Base
{
   DIST1 dist1;
   uint32_t distx;
   COUNT1 c;
   char   name[NAME_LEN];
};

typedef SomeStruct2Base<LongDist, LongCount, SHORT_NAME> SomeStruct2Long;
typedef SomeStruct2Base<LongDist, LongCount, SHORT_NAME> SomeStruct2Short;
typedef SomeStruct2Base<LongDist, LongCount, LONG_NAME> SomeStruct2Ext;

Вышеприведенное не очень согласовано, и я думаю, что было бы лучше передать String <6> или что-то еще вместо передачи параметра int в шаблон. Нет * * 1004

Обновление: я использую эту структуру для анализа сетевых данных, представленных в буферах символов, поэтому структура должна иметь возможность reinterpret_cast <>. Извините, я не упомянул об этом раньше, но я упоминаю об этом сейчас, поскольку вижу, что некоторые из этих предложений потерпят неудачу.

Ответы [ 3 ]

4 голосов
/ 26 апреля 2011

Используйте параметр std::size_t в шаблоне, а затем предоставьте перегрузку operator char*.Например:

template <std::size_t N>
class String {
  public:
    operator char*()
    {
        return data;
    }
  private:
    char data[N];
};

Некоторые люди думают, что operator char* (и другие операторы неявного преобразования) - это плохо, и они могут быть правы.Вы действительно должны прочитать об опасностях его использования, прежде чем совершать его, потому что это не всегда лучшая идея.

0 голосов
/ 26 апреля 2011

Вы можете использовать следующую структуру:

template<unsigned int SIZE>
struct String { typedef char t[SIZE]; };

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

int main ()
{
  char a[20];
  String<20>::t b;
  //sizeof(a) = sizeof(b); both are equivalent
}

На самом деле вы можете сделать это обобщение для любого типа:

template<typename T, unsigned int SIZE>
struct MyArray { typedef T t[SIZE]; };
0 голосов
/ 26 апреля 2011

Вы можете добавить operator=, чтобы разрешить даже более холодные назначения:

template <size_t N>
class String {
  public:
    operator char*()
    {
        return data;
    }

    String& operator=(char* const &rhs)
    {
        strcpy_s(data, N, rhs);
        return *this;
    }
  private:
    char data[N];
};

int main()
{
    String<20> str;
    // You can do this:
    str = "This can be done";

    String<40> another;
    // And this:
    another = str;

    // ... and this:
    another = str = "Ciao";
}

Обратите внимание, что вы должны использовать strcpy_s.

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