C ++ / Шаблон / Явная инициация типа шаблона? - PullRequest
0 голосов
/ 19 октября 2011

Предположим следующий фиктивный шаблон:

template < class DataType > class Dummy
{
public:
    void init( )
    {
        m_data = DataType( 0 );
    }

private:
    DataType m_data;
};

Вызов init запустит внутренние данные.Это работает нормально, когда DataType является стандартным типом данных (например, int или float).Когда DataType является классом, этот класс должен иметь соответствующий конструктор.

Теперь предположим, что DataType должен быть, например, комплексным числом, представленным подходящим классом.В этом случае не имеет смысла давать классу Комплексного числа конструктор с одним аргументом, потому что в нормальных условиях вы хотите инициализировать действительную и мнимую части.

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

Я думаю, что, например, STL должен реализовывать такие мысли, но я потерян в этом коде.

Ответы [ 3 ]

5 голосов
/ 19 октября 2011

В вашем примере, я думаю, вы имели в виду:

DataType( 0 );

Не:

Data ( 0 );

В любом случае попробуйте:

m_data = DataType();

Это вызовет конструктор по умолчанию для типа класса или будет иметь нулевое значение для встроенного типа.

1 голос
/ 19 октября 2011

Можно использовать аргумент по умолчанию как:

template <class T> 
class A
{
public:
    void init(T c = T()) //default argument
    {
        m_data = c;
    }
private:
    T m_data;
};

Если тип аргумента шаблона T является пользовательским типом и не определяет по умолчанию конструктор, тогда вы должны передать один аргумент функции init() самостоятельно, в противном случае вы получите ошибку компиляции.

Этот подход принят Стандартной библиотекой.Например, std::vector::resize() принимает необязательный аргумент, следуя тому же обоснованию, которое упоминалось выше.

0 голосов
/ 19 октября 2011

По сути, вы думаете здесь с точки зрения «конструируемых по умолчанию» классов, то есть классов, которые могут быть инициализированы без какого-либо специфичного для класса ввода.STL написан с учетом этого термина, и, как писал @DanielEarwicker, конструктор по умолчанию для встроенных типов определен как инициализация нуля.

Итак, чтобы получить такую ​​функцию, ваш класс комплексных чиселдолжен поддерживать конструктор по умолчанию, т.е. конструктор без аргументов.

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