Pull to refresh
16
0
Send message
В Японии уже на квантовых директоров перешли, а у нас в Рашке-Непоспевашке всё ещё дигитальными пользуются.
Во вкусовых холиварах всегда можно задать вопрос, а как поступает STL в подобных контекстах? А STL поступает, например, так:
// in std::map
pair<iterator,bool> insert (const value_type& val);
Немного не в тему, но всё же: Scott Meyers «Effective Modern C++» переводиться будет?
птн-хло! крымнаш! понеслась :)
Вот это нечто подобное как раз и есть самое интересное. Ведь нужно вызвать оператор new с типом класса-наследника, а не с базовым.
Это больноватое ограничение. К примеру, у вас есть вектор указателей на класс Widget. Что на самом деле за каждым из них скрывается известно лишь шефу Аллаха. И вот, Вам нужно все виджеты сохранить, а потом загрузить. У boost'а это достигается с помощью уродливых препроцессорных манипуляций. Любое другое решение было бы интересным.
Есть восможность сериализировать и, самое главное, десериализировать обьект производного класса полиморфно по указателю на базовый?
Круто. У меня на clang'е в release только пришлось volatile дописать:
instantate<int, double, bool, char, const char*> inst;
После того, как Страуструп перечитал свою последнюю книгу, он понизил оценку до 7.
Если бы знал, что последуют комментарии, почему списки типов вместо вариадиков и т.д, то сразу бы написал с вариадиками. Именно с ними и будет показано решение во второй части. Здесь речь идёт о том, как добиться переноса определения шаблона в исходный файл. А какие инструменты для этого используются — это уже вторично.
Глянул Вашу либу, с map — интерессная штука. Где-то применяли?
Это, скорее не задача, а улучшение, если судьба шаблона — быть инстанциированным только для опеределённого набора типов. Улучшение заключается в переносе определения шаблона в исходник.
Внесу и свой костыль:

Этот костыль можно было предвидеть. EmptyType был специально оставлен, чтобы приём с рекурсией был более понятен, если с ним кто незнаком.

Но если уже задаваться целью от него избавиться, то тогда уже можно не стесняться:
template <typename... Types> using NiceTypeList =  TypeList<Types..., EmptyList>;
typedef NiceTypeList<int, double, bool, char, const char*> MyTypeList;



А если задача состоит только в ограничении типов, которыми можно инстанциировать шаблон, то, как по мне, проще что-то такого:

В том то и дело, что основная цель состоит не в ограничении типов, а в переносе определения шаблона в исходник.
Верно. Во второй части как раз нечто похожем и пойдёт речь. Я хотел показать весь мыслительный путь к окончательному решению.
Ашот Моисеевич,
нам с Акакием Ананиевичем тоже очень понравилась статья и, особенно, Ваш интерес к Хабру в свободное от работы время.
Ждём Вас у нас наверху после обеда.

П.С. Постарайтесь не попортить Ивана.
Да, но тут дело в том, что значения успевают скопироваться в контейнер до того как выходят из поля зрения.
Следующий код работает:
auto spy = createSignalSpy(&signalSource,  &SignalClass::someSignal);
    {
        double a = 3.2;
        int b = 4;
        signalSource.f(a, b);
    }
    std::cout<<get<0>(spy.calls.front())<<"\n";
    std::cout<<get<1>(spy.calls.front())<<"\n";

Выдаёт:
3.2
4
Да, Вы правы, так и есть. Но если мы используем сигнал базового класса, а в фабрику передаем указатель на наследника, то можно просто поступить так:
auto spy = createSignalSpy(static_cast<Base*>(&derivedObject), &Base::signalInBase).

п.с спасибо за указание на опечатку — исправил
Об этом я не подумал. Но только что проверил дома — работает.
А с советом от Lol4t0 про decay — должно вообще на 110 процентов работать.

Information

Rating
Does not participate
Registered
Activity