2016-04-19 2 views
1

В QuantLib я нашел этот кусок кода:C++ Специализация нулевой шаблон для класса

//! specialization of null template for this class 
    template <> 
    class Null<Array> { 
     public: 
     Null() {} 
     operator Array() const { return Array(); } 
    }; 

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

+0

Именованное значение по умолчанию. – Jarod42

+0

Что вы не понимаете? синтаксис специализации? цель этого класса в контексте QuantLib. – Jarod42

+0

Оба.Я могу догадаться, что где-то определен класс Null, и здесь мы инициализируем его с помощью 'Array', но я не понимаю больше этого. и да в контексте квантлиба, что это делает? –

ответ

2

Я догадываюсь, что есть Null класс, определенный где-то, и здесь мы инициализируем его Array.

Почти правильный. Существует Null класс template, определенный где-то, с аргументом типа. И здесь мы создаем шаблон так, чтобы всякий раз, когда шаблон создавался с типом Array, это определение используется вместо исходного определения.

Что касается Null, см. documentation.

класс шаблона, предоставляющий нулевое значение для заданного типа.

+0

Вы знаете, почему специализация нужна здесь? Первичной версии должно быть достаточно. – songyuanyao

+0

@songyuanyao У меня нет опыта работы с квантлибом, но быстрый взгляд на заголовок, который определяет «Null», первичная версия кажется пустой. Специалисты Float и integer возвращают максимальное значение для своих соответствующих типов (определенных в макросе в каком-то другом файле), поэтому они не будут работать с инициализированной версией по умолчанию, которую эта специализация имеет. – user2079303

+1

Версия по умолчанию кажется подходящей только для скалярных арифметических типов: она просто определяет значения по умолчанию в зависимости от того, является ли тип целым или реальным (с плавающей запятой). Тогда это поведение по умолчанию не будет работать слишком хорошо в их структурах данных, таких как «Массив». –

3

Значение Null используется для представления отсутствующих значений.

Например, когда вы получаете QL :: Real г вы можете легко проверить, если он имеет нулевое значение:

if(r == Null<Real>()) 

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

+0

Интересно, как это используется для проверки нулевого значения. Можете ли вы привести пример того, как это используется для функции, которая принимает Array в качестве дополнительного аргумента? спасибо –

1

Ответы пользователя2079303 и jimifiki являются правильными. Я добавляю этот ответ, чтобы предоставить немного контекста.

Шаблон класса Null используется для добавления нулевого значения, аналогичного тому, что None находится в Python, и используется в качестве аргумента по умолчанию, когда (по какой-либо причине) мы хотим обнаружить, что вызывающий объект не прошел значение, в отличие от явно переданного значения «null», например, 0. Если бы мы сегодня должны были написать код, мы бы, скорее всего, пошли бы за boost::optional (скоро это будет std::optional), что дает более четкую семантику и явный объект nil. Тем не менее, мы сохраняем Null, чтобы не нарушать код клиента.

Для арифметических типов вещь работает, предоставляя специализацию Null, которая при преобразовании в число дает ту, которая вряд ли будет передана как законное значение (по крайней мере, в контексте вызова); а именно максимальный доступный int или float в зависимости от типа. Для Array это на самом деле не применяется: как вы видите, Null<Array>() преобразует в пустой Array, который код не может отличить от пустого экземпляра Array, переданного явно. Тем не менее, можно утверждать, что пустой массив является нулевым значением в своем собственном праве (т. Е. Путем передачи пустого массива вы не передаете никаких значений, даже если вы передаете экземпляр Array), поэтому такие разработки выполняются; то же самое относится к классу Date, который имеет пустое состояние, возвращенное его специализацией Null.

+0

Очень ясно! Спасибо. Не могли бы вы дать быстрый пример функции, которая принимает Array в качестве дополнительного аргумента, используя специализацию Null? спасибо –

+1

Быстрый поиск дает кучу файлов заголовков в папке 'ql/legacy/libormarketmodels'. –

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