- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
class TFunctorMap
{
public:
typedef bool (*TFunctor)(const TSentenceList&, unsigned short &);
private:
std::map<char, TFunctor> _functorMap;
public:
TFunctorMap(void)
{
_functorMap.insert(std::make_pair('g', &RZC));
_functorMap.insert(std::make_pair('t', &STN));
_functorMap.insert(std::make_pair('d', &RTC));
}
TFunctor GetFunctor(const char Key)
{
if (_functorMap.find(Key) == _functorMap.end())
return NULL;
return _functorMap[Key];
}
};
HaskellGovno 16.05.2012 13:23 # 0
defecate-plusplus 16.05.2012 13:57 # 0
function<bool(...)>
а еще обычный массив из N (<= CHAR_MAX) функторов (да хоть бы и указателей на функции) может быть выгоднее
HaskellGovno 16.05.2012 14:32 # 0
Правда, без function<...> будет оптимальнее.
Только зачем unordered_map? Ну и с массивом будет не удобно.
HaskellGovno 16.05.2012 14:37 # 0
bormand 16.05.2012 17:09 # +2
HaskellGovno 16.05.2012 19:50 # 0
bormand 16.05.2012 20:24 # 0
P.S. Кину камень в огород STLовцев: в Qt у мапа есть метод value, в который можно передать дефолтное значение. И код можно было бы переписать так:
TarasB 16.05.2012 21:48 # 0
Может быть, надо, чтобы value() возвращало не элемент, а ссылку на него, тогда NULL будет стопудов означать, что элемент не найден.
roman-kashitsyn 17.05.2012 00:07 # +1
HaskellGovno 17.05.2012 00:55 # 0
Сейчас это есть уже во всех вменяемых языках.
Только этот "паттерн" придумали не функциональщики, а сишники и ассемблерщики. Правда они для этого использовали некоторое значения, которое в контексте их типа запрещено или не имеет смысла (не входит в домен типа). Функциональщики лишь сделали их идею чуточку красивее.
roman-kashitsyn 17.05.2012 07:44 # 0
Это совсем разные вещи. Одно дело когда ты на уровне ТИПА объявляешь, что результата может и не быть, как минимум заставляя задуматься пользователя своего API, и совсем другое дело, когда ты возвращаешь -1 или null, который никак не форсируется для проверки.
К тому же, Maybe/Optional - это монада :)
HaskellGovno 17.05.2012 11:43 # 0
Не видишь связи? Тогда ФП головного мозга.
>возвращаешь -1 или null, который никак не форсируется для проверки.
Дык кто мешает проверять? Сделать функцию, которая преобразует один тип в другой на уровне сишечки, при этом проверяя значение? Или даже не преобразовывая на ассемблере. Это ты привык, что все безопасно и ничего забыть нельзя, ибо компилятор скажет. В те времена не было такой возможности на ассемблере.
Да и NULL для поинтера часто проверяется автоматически, впрочем не так часто в те времена.
>Maybe/Optional - это монада
ФП головного мозга. Ещё скажи, что в коде выше тоже монада.
roman-kashitsyn 17.05.2012 11:54 # 0
Благо, сейчас часто надёжность и читаемость важнее скорости выполнения, а компиляторы стали умнее программиста.
И да, это совсем разные вещи. Ты возвращаешь уже не число, а контейнер, в котором, быть может, лежит число. Если у тебя Map<Int, Int>, то без Optional тебе сложно обойтись.
HaskellGovno 17.05.2012 11:57 # 0
Да капитан. Но этот тот же "паттерн".
roman-kashitsyn 17.05.2012 12:01 # 0
Плюс с Optional можно строить цепочки вычислений, каждое из которых может окончится неудачей, без утомительных проверок на нуллы и всякие минус единички.
bormand 17.05.2012 05:42 # 0
>а ссылку на него
А ссылка в с++ не может быть NULL, она по определению на что-то ссылается. Так что остаются указатель или итератор.