Как другие упомянули, функтор является объектом, который действует как функция, т.е. он перегружает оператор вызова функции.
Функторы являются наиболее часто используемыми в алгоритмах STL. Они полезны, потому что они могут содержать состояние прежде и между вызовами функции, как закрытие на функциональных языках. Например, Вы могли определить MultiplyBy
функтор, который умножает его аргумент на указанную сумму:
class MultiplyBy {
private:
int factor;
public:
MultiplyBy(int x) : factor(x) {
}
int operator () (int other) const {
return factor * other;
}
};
Тогда Вы могли передать MultiplyBy
объект к алгоритму как станд.:: преобразуйте:
int array[5] = {1, 2, 3, 4, 5};
std::transform(array, array + 5, array, MultiplyBy(3));
// Now, array is {3, 6, 9, 12, 15}
Другое преимущество функтора по указателю на функцию состоит в том, что вызов может быть встроен в большем количестве случаев. При передаче указателя функции transform
если , что вызов был встроен и компилятор не знает, что Вы всегда передаете ту же функцию ему, это не может встроить вызов через указатель.
Свойство значения доступно только для чтения и возвращает фактический тип значения. Свойство value никогда не может иметь значение NULL.
Если вы ожидаете, что значение, допускающее значение NULL, вернется, проверьте .HasValue, а затем укажите Value. Например, если вы хотите присвоить значение Nullable обычному логическому типу, вам нужно указать его значение:
bool? nullableBool = null;
if (nullableBool.HasValue)
{
bool realBool = nullableBool.Value;
}
Однако следующий не будет компилироваться:
bool? nullableBool = true;
bool realBool = nullableBool; // Won't work
Если вы хотите использовать методы / свойства базового типа. На самом деле не относится к bool. Позвольте мне проиллюстрировать это с помощью DateTime
:
DateTime? d;
int month = d.Value.Month;
Вы не можете получить доступ к свойству Month непосредственно из d, потому что DateTime? не имеет этого свойства.
Для меня это не столько значение, сколько свойство HasValue, которое я считаю полезным
Единственная разница в том, что это 2 разных типа. Если у вас есть bool? , то это тип bool, допускающий значение NULL.
Если вы вызываете b.Value , вы фактически возвращаете bool , а не a bool? .
Незаметно, но когда вам нужна версия объекта, не допускающая значения NULL, используйте свойство .Value.
.Value возвращает логическое значение, а не логическое значение? что позволит вам использовать его в качестве параметра для функций, которые не ожидают типов, допускающих значение NULL.