Ого! У меня намного проще крестики-нолики, если это можно назвать крестиками-ноликами.
Так автор faslib, это Вы?
Эти пакеты разработаны для поддержки пакета fas/aop (в котором реализованы аспектно-ориентированные сущности), который я активно использую в реальных проектах уже более 8 лет. Если эта тема будет интересна, то я о ней тоже с удовольствием расскажу, но это потребует, возможно, целого цикла статей.
Та ну, это Вы накрутили.
Всем и так ясно, что локальная переменная i типа int, скрывает глобальную переменную i типа double и cout в main выведет 20, а cout в f выведет 3.14, поскольку он понятия не имеет о какой-то локальной переменной в другой функции :)
В этом смысле я не понимаю тех, кто так рьяно рвётся на работу: предположим, вы будете активно трудиться до 60-65 лет, а значит, ещё более 40 лет трудовой жизни ещё впереди. Откуда желание побыстрее в это дело окунуться? Не успеете наработаться?..
Иногда — по финансовым причинам. Нужно на что-то жить. Хочется на что-то жить. Тем более, если некому тебя содержать.
Для некоторого количества студентов +2 года в магистратуре означают +2 года общаги. Если найм жилья дорогой, это может быть весомым аргументом.
Также немножко спорно. Если условия «не очень» в общаге, то ни поучиться, ни поработать возможности нет. А с работой появляется возможность с другом/знакомым на пару снять квартиру. С нормальными условиями. А нормальные условия, раньше я это не очень понимал, ух как влияют на самочувствие, продуктивность.
По сути, сравнивать можно только при DEBUG, так как несоответствие типов происходит только по вине программиста(т.е, задал неправильный callback) — если производительность настолько важна. Но это немножко запутанно, так как придётся оговариваться — «этот тип обозначаем через 0, а этот через 1 и в TypeHelper::name() возвращаем для всех числовых типов 0, потому что смотри выше… и т.д.». Да, Вы абсолютно правы и если производительность совсем критична, и сравнивать типы на соответствие нужно при каждом вызове(кстати, можно сравнивать только первый раз, так как типы с++-функции не поменяются в рантайме… хм..), а не только при определённом DEBUG, то мапить типы можно и на char(unsigned char, если 128 типов о_О не хватает). В любом случае — это вопрос оптимизации, которая, к сожалению, в большинстве случаев приводит к менее читаемому коду…
Я же написал: сделаем сначала новым стандартом, а потом тоже самое — старым.
Видно по коду очень хорошо, учитывая, как намешан boost и stl из C++11
Покажите с++11 часть, где используется boost, кроме конечно, InvokeParser — и об этом я специально упомянул — парсинг строки не важен, по сути:
Если парсинг xml сделать например на pugixml,
Ага, заменить одну библиотеку — другой.
Следующий пункт:
Но больше всего конечно убило полное непонимание variadic templates и логики работы и места назначения generate_sequence.
Покажите, как правильно, пожалуйста.
И ещё:
FunctionCaller реализуется вариадиками без напрягов и не требует специализаций по кол-ву аргументов.
Старый стандарт, покажите, как вы будете вариадики в старом стандарте использовать и сразу же скажите об этом комитету по стандартизации — они, ведь, обманули — вариадики-же были и до нового стандарта, не правда ли?
И ещё:
boost можно выкинуть полностью, то что вы используете из boost, имеет либо аналоги в stl, либо реализуется совсем просто тем же stl
Вы предлагаете свой boost::function_traits написать? Зачем? Это не сложно(файлик boost\trunk\boost\type_traits\function_traits.hpp содержит около 175 строчек несложных примеров использования частичной специализации шаблона) и отвлекает от решения задачи.
У вас в итоге получилась каша из C++03, C++11, boost.
Мешал только C++03 и boost(не учитываем InvokeParser), а не {C++03, boost, C++11} и {C++03, C++11}, и {boost, C++11}.
Уж простите, но сначала стоит выучить C++11 (если уж используете его), потом учить других.
Уж простите, сначала вы научите всех, как внимательно читать статью, а потом расскажите, как использовать вариадики в старом стандарте, а потом посоветуете для парсинга маленькой xml заменить одну библиотеку на другую.
мне одному так тяжело код с таким стилем читать? Или я очень придирчив?
Так автор faslib, это Вы?
Требую цикл статей!
Такая же, как и в ответе на stackoverflow.
Вот здесь поинтересней (ещё)
И в случае с
foo(1,2.3, “abcd”)
тип 3го аргумента шаблона действительно выведется вconst char*
. Простите, я невнимателен.Не совсем так: тип
“abcd”
— этоchar const [5]
, а неconst char*
Уточнение — на частичную специализацию функций.
По поводу Unpacking — ещё можно использовать std::make_index_sequence (14 стандарт), но можно и самому написать gens, stackoverflow
Спасибо за статью!
Всем и так ясно, что локальная переменная
i
типаint
, скрывает глобальную переменнуюi
типаdouble
иcout
вmain
выведет20
, аcout
вf
выведет3.14
, поскольку он понятия не имеет о какой-то локальной переменной в другой функции :)Спасибо за статью
Иногда — по финансовым причинам. Нужно на что-то жить. Хочется на что-то жить. Тем более, если некому тебя содержать.
Также немножко спорно. Если условия «не очень» в общаге, то ни поучиться, ни поработать возможности нет. А с работой появляется возможность с другом/знакомым на пару снять квартиру. С нормальными условиями. А нормальные условия, раньше я это не очень понимал, ух как влияют на самочувствие, продуктивность.
, если 128 типов о_О не хватает) — не обращайте внимания, глупость:)DEBUG
, так как несоответствие типов происходит только по вине программиста(т.е, задал неправильный callback) — если производительность настолько важна. Но это немножко запутанно, так как придётся оговариваться — «этот тип обозначаем через 0, а этот через 1 и вTypeHelper::name()
возвращаем для всех числовых типов 0, потому что смотри выше… и т.д.». Да, Вы абсолютно правы и если производительность совсем критична, и сравнивать типы на соответствие нужно при каждом вызове(кстати, можно сравнивать только первый раз, так как типы с++-функции не поменяются в рантайме… хм..), а не только при определённомDEBUG
, то мапить типы можно и наchar
(unsigned char
, если 128 типов о_О не хватает). В любом случае — это вопрос оптимизации, которая, к сожалению, в большинстве случаев приводит к менее читаемому коду…Я же написал: сделаем сначала новым стандартом, а потом тоже самое — старым.
Покажите с++11 часть, где используется boost, кроме конечно,
InvokeParser
— и об этом я специально упомянул — парсинг строки не важен, по сути:Ага, заменить одну библиотеку — другой.
Следующий пункт:
Покажите, как правильно, пожалуйста.
И ещё:
Старый стандарт, покажите, как вы будете вариадики в старом стандарте использовать и сразу же скажите об этом комитету по стандартизации — они, ведь, обманули — вариадики-же были и до нового стандарта, не правда ли?
И ещё:
Вы предлагаете свой
boost::function_traits
написать? Зачем? Это не сложно(файлик boost\trunk\boost\type_traits\function_traits.hpp содержит около 175 строчек несложных примеров использования частичной специализации шаблона) и отвлекает от решения задачи.Мешал только C++03 и boost(не учитываем InvokeParser), а не {C++03, boost, C++11} и {C++03, C++11}, и {boost, C++11}.
Уж простите, сначала вы научите всех, как внимательно читать статью, а потом расскажите, как использовать вариадики в старом стандарте, а потом посоветуете для парсинга маленькой xml заменить одну библиотеку на другую.
Зачем использовать
decltype(&T::operator())
в двух местах, если же выше у Вас написано:Или я что-то не понял?