Я хочу определить тип 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 <>. Извините, я не упомянул об этом раньше, но я упоминаю об этом сейчас, поскольку вижу, что некоторые из этих предложений потерпят неудачу.