2010-02-22 2 views
0

Учитывая следующий фрагмент кода:C++ при инициализации шаблона

template<typename T> 
class MyContainer 
{ 
    typedef T value_type; 
    typedef unsigned int size_type; 

    ... 
}; 

Как следует инициализировать переменные, используя size_type (например, индексы цикла)?
Должна ли она быть:

for(size_type currentIndex = size_type(0);currentIndex < bound;++currentIndex) 

или

for(size_type currentIndex = static_cast<size_type>(0);currentIndex < bound;++currentIndex) 

Обоснование вопроса является создание кода, который будет по-прежнему работать, когда тип основной size_type изменен или добавлены параметры шаблона.

Благодаря ...

+0

Добавлено логическое соображение. –

ответ

4

Есть четыре варианта, которые я вижу:

size_type(); 
size_type(0); 
static_cast<size_type>(0); 
0; 

я предпочел бы последнее. Это кратким и имеет тот же эффект, что и остальные.

Возможно, вы обеспокоены тем, что если изменение типа это не сработает или что-то еще. Дело в том, что size_type являются, по договоренности, целыми числами без знака. 0 всегда будет действительным значением, если size_type является разумным & правильным размером.

+0

Это швы разумные, но что, если я в какой-то момент захочу использовать свой собственный тип - например, MyHugeIntegerType? –

+0

@ Bartłomiej: Планируете ли вы создать плохо сформированный целочисленный тип, который не имеет нуля? – GManNickG

+0

@GMan Я не планирую делать неверно сформированный целочисленный тип, но скорее рассмотрю возможность использования типа, который не подразумевает возможность литья из целых типов (т. Е. Имеет явный конструктор) –

1

Учитывая, что ваш шаблон говорит, что его неподписанных INT, что случилось с

for(size_type currentIndex = 0;currentIndex < bound;++currentIndex) 

?

Если вы делаете это по причине записи типа позднее, то, лично, я бы определенно пошел со способом построения (т.е. первым).

0

Первый случай выглядит довольно. Еще вы можете сделать следующее:

for(size_type currentIndex = size_type(/*empty*/); 
Смежные вопросы