Pull to refresh
31
0

User

Send message
Sergey Kosarevsky,
мне одному так тяжело код с таким стилем читать? Или я очень придирчив?
Ого! У меня намного проще крестики-нолики, если это можно назвать крестиками-ноликами.
Так автор faslib, это Вы?

Эти пакеты разработаны для поддержки пакета fas/aop (в котором реализованы аспектно-ориентированные сущности), который я активно использую в реальных проектах уже более 8 лет. Если эта тема будет интересна, то я о ней тоже с удовольствием расскажу, но это потребует, возможно, целого цикла статей.

Требую цикл статей!
Вот она:
366	// Compile-time integer sequences
367	// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3658.html
368	// (Note that we only implement index_sequence, and not the more generic integer_sequence).
369	template<size_t... indexes> struct index_sequence {
370	    static size_t size() { return sizeof...(indexes); }
371	};
372	
373	template<size_t currentIndex, size_t...indexes> struct make_index_sequence_helper;
374	
375	template<size_t...indexes> struct make_index_sequence_helper<0, indexes...> {
376	    typedef std::index_sequence<indexes...> type;
377	};
378	
379	template<size_t currentIndex, size_t...indexes> struct make_index_sequence_helper {
380	    typedef typename make_index_sequence_helper<currentIndex - 1, currentIndex - 1, indexes...>::type type;
381	};
382	
383	template<size_t length> struct make_index_sequence : public make_index_sequence_helper<length>::type { };


Такая же, как и в ответе на stackoverflow.
Вот здесь поинтересней (ещё)
Не наверное, а точно!
И в случае с foo(1,2.3, “abcd”) тип 3го аргумента шаблона действительно выведется в const char*. Простите, я невнимателен.
Вызов foo(1,2.3, “abcd”) инстанциируется в foo<int, double, const char*>(1, 2.3, “abcd”)

Не совсем так: тип “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, поскольку он понятия не имеет о какой-то локальной переменной в другой функции :)
Не читал статью, но сразу хочу сказать — посмотрите доклад — Вы ничего не потеряете — Скотт ооочень интересно рассказывает.
Спасибо за статью
В этом смысле я не понимаю тех, кто так рьяно рвётся на работу: предположим, вы будете активно трудиться до 60-65 лет, а значит, ещё более 40 лет трудовой жизни ещё впереди. Откуда желание побыстрее в это дело окунуться? Не успеете наработаться?..

Иногда — по финансовым причинам. Нужно на что-то жить. Хочется на что-то жить. Тем более, если некому тебя содержать.
Для некоторого количества студентов +2 года в магистратуре означают +2 года общаги. Если найм жилья дорогой, это может быть весомым аргументом.

Также немножко спорно. Если условия «не очень» в общаге, то ни поучиться, ни поработать возможности нет. А с работой появляется возможность с другом/знакомым на пару снять квартиру. С нормальными условиями. А нормальные условия, раньше я это не очень понимал, ух как влияют на самочувствие, продуктивность.
Отменяют постепенно. Я в своём университете — последний специалист:)
А с производительностью что? Как-то можно сравнить?
Спасибо за наводку, буду знать.
char(unsigned char, если 128 типов о_О не хватает) — не обращайте внимания, глупость:)
По сути, сравнивать можно только при 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 заменить одну библиотеку на другую.
Точнее, даже в трёх
По поводу этого:
template <typename T, typename ... Args>
  std::shared_ptr<task<decltype(&T::operator())>> make_task(T func, Args ... args )
  {
    return std::shared_ptr<task<decltype(&T::operator())>>(new task<decltype(&T::operator())>(func, args ...));
  }

Зачем использовать decltype(&T::operator()) в двух местах, если же выше у Вас написано:
template <typename T>
  class task
      : public task<decltype(&T::operator())>
  {
  };


Или я что-то не понял?

Information

Rating
Does not participate
Location
Киев, Киевская обл., Украина
Registered
Activity