2016-04-01 2 views
1

У меня есть класс, как это:Используйте шаблонный класс без шаблона

template<size_t MAX_SIZE> 
struct Buffer{ 
    size_t size; 
    char data[MAX_SIZE]; // this must be inside the struct itself 
    constexpr static size_t max_size = MAX_SIZE; 
}; 

Мне нужно, чтобы иметь возможность пройти этот класс, чтобы функционировать, что не следует использовать шаблон, в настоящее время я делаю что-то вроде этого:

void process(size_t &size, char *data, size_t max_size); 

int main(){ 
    Buffer<1024> b; 
    process(b.size, b.data, b.max_size); 
} 

Есть ли лучший способ сделать то же самое? Я могу думать о базовом классе и передавать по ссылке, но он становится слишком сложным, чтобы быть правильным.

(Это не фактический код, пожалуйста, не обращайте внимания, если есть синтаксические ошибки.)

+2

вы, вероятно, хотите избежать вопроса, но: почему процесс не разрешен для использования шаблона? что можно использовать и почему? – IceFire

+0

хорошо вопрос. разум не на 100% ясен для меня - интуиция. размышляй об этом. Серьезно - я хочу, чтобы код процесса() находился в другом файле .o. – Nick

+0

Ваша интуиция, вероятно, заключается в том, что вы также не хотите, чтобы процесс стал шаблоном. Это требует более глубокого мышления: наличие MAX_SIZE в качестве аргумента шаблона означает, что он определяет тип. Следовательно, процесс должен стать шаблоном для работы с несколькими различными типами. Если Buffer должен быть только точно одним типом, то MAX_SIZE не должен быть аргументом шаблона. – IceFire

ответ

5

Я хотел бы использовать обертку-метод ...

template<size_t MAX_SIZE> 
void process(Buffer<MAX_SIZE>& buffer) 
{ 
    process(buffer.size, buffer.data, buffer.max_size); 
} 

... а потом просто звоните ...

int main() 
{ 
    Buffer<1024> buffy; 
    process(buffy); 
    return 0; 
} 
5

Я не понимаю, почему вызываемая функция требуется, чтобы избежать использования шаблонов. Кажется, это произвольное ненужное ограничение.

Просто предоставьте вспомогательную функцию и преобразование из вашего шаблонного типа.

struct Helper 
{ 
    size_t size; 
    size_t max_size; 
    char *data; 
}; 

template<size_t MAX_SIZE> 
struct Buffer 
{ 
    size_t size; 
    char data[MAX_SIZE]; // this must be inside the struct itself 

    constexpr static size_t max_size = MAX_SIZE; 

    operator struct Helper() {return Helper {size, max_size, &data[0]};}; // C++11 
    //  operator struct Helper() {Helper temp(size, max_size, &data[0]); return temp;}; // pre C++11 

}; 

void process(struct Helper); 

int main() 
{ 
    Buffer<1024> b; 
    process(b); // or process(Helper(b)) 
} 

Пока вы избегаете C++ специфических особенностей, то Helper типа также может быть передано С.

0

Если ваши рассуждения не использовать шаблоны, что вы не хотите есть номера Buffer S переданный функции, то позвольте мне сказать вам, что это не проблема. Вы можете использовать параметр шаблона для всего размера, как

template<size_t MAX_SIZE> 
void process(Buffer<MAX_SIZE>& buffer) 
{ 
    //do stuff here 
} 

И теперь вы можете передать только Buffer к process. Вы можете передать любой размер Buffer, но это займет всего Buffer s.

Live Example

1

Что об использовании ЬурейеЕ. Я имею в виду, вы можете использовать следующую сигнатуру для вашей функции: void process(const Buffer<1024>& b);, но она не очень подходит из-за объявления параметра шаблона. Если вы измените значение на что-то еще, вы также должны изменить подпись. Чтобы этого избежать, попробуйте использовать typedef. Что-то вроде этого

typedef Buffer<1024> TBuffer; 

void process(const TBuffer& buffer); 

int main(){ 
    TBuffer b; 
    process(b); 
} 

При изменении значения шаблона в этом случае вам не нужно менять остальную часть кода.

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