Значение по умолчанию для константы шаблона в C ++ - PullRequest
4 голосов
/ 24 июня 2019

Я пытаюсь заменить глобальный размер буфера на тот, который можно изменить для тестов.Текущий код выглядит примерно так:

static const uint32_t BUFFER_SIZE = 1 << 8;

class BufferWrapper {
.
.
.

char buffer_[BUFFER_SIZE];
};

Это вызывает проблему, когда я пытаюсь изменить BUFFER_SIZE для тестов.Таким образом, я надеялся сделать BUFFER_SIZE константой шаблона и иметь значение по умолчанию для указанной константы, чтобы мне нужно было указывать его только во время тестов, что-то вроде:

static const uint32_t BUFFER_SIZE = 1 << 8;

template <uint_32 SIZE = BUFFER_SIZE>
class BufferWrapper {
.
.
.

char buffer_[SIZE];
};

Таким образом, предыдущие объявления могутпо-прежнему компилируется как:

BufferWrapper buf

Но во время теста я мог бы написать что-то вроде этого, чтобы проверить буфер размером 1 КБ:

BufferWrapper<1024> test_buf;

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

error: use of class template 'BufferWrapper' requires template arguments; argument deduction not allowed in function prototype

Ответы [ 2 ]

4 голосов
/ 24 июня 2019

Поскольку этот ответ утверждает, что код в порядке с C ++ 17.Однако, если у вас нет доступа к этому, вы все равно можете обойти необходимость изменить весь существующий код, чтобы использовать BufferWrapper<> вместо BufferWrapper.

Сделайте это, переименовав BufferWrapper во что-то другое(например, BufferWrapperTemplate) и предоставление псевдонима типа для версии размера по умолчанию:

template <uint_32 SIZE = BUFFER_SIZE>
class BufferWrapperTemplate {
.
.
.

char buffer_[SIZE];
};

typedef BufferWrapperTemplate<> BufferWrapper;

Таким образом, весь существующий код может продолжать использовать BufferWrapper, а тесты могут использовать BufferWrapperTemplate<42> при необходимости.

3 голосов
/ 24 июня 2019

Нет проблем с показанной программой на C ++ 17.

До C ++ 17 вы должны предоставить список аргументов шаблона, даже если он пуст:

BufferWrapper<> test_buf;

В таком случае вы можете избежать изменения кода клиента, используя псевдоним типа:

template <uint_32 SIZE = BUFFER_SIZE>
class BufferWrapperTemplate;

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