Это больноватое ограничение. К примеру, у вас есть вектор указателей на класс Widget. Что на самом деле за каждым из них скрывается известно лишь шефу Аллаха. И вот, Вам нужно все виджеты сохранить, а потом загрузить. У boost'а это достигается с помощью уродливых препроцессорных манипуляций. Любое другое решение было бы интересным.
Если бы знал, что последуют комментарии, почему списки типов вместо вариадиков и т.д, то сразу бы написал с вариадиками. Именно с ними и будет показано решение во второй части. Здесь речь идёт о том, как добиться переноса определения шаблона в исходный файл. А какие инструменты для этого используются — это уже вторично.
Глянул Вашу либу, с map — интерессная штука. Где-то применяли?
Это, скорее не задача, а улучшение, если судьба шаблона — быть инстанциированным только для опеределённого набора типов. Улучшение заключается в переносе определения шаблона в исходник.
Ашот Моисеевич,
нам с Акакием Ананиевичем тоже очень понравилась статья и, особенно, Ваш интерес к Хабру в свободное от работы время.
Ждём Вас у нас наверху после обеда.
Да, но тут дело в том, что значения успевают скопироваться в контейнер до того как выходят из поля зрения.
Следующий код работает:
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";
Да, Вы правы, так и есть. Но если мы используем сигнал базового класса, а в фабрику передаем указатель на наследника, то можно просто поступить так:
auto spy = createSignalSpy(static_cast<Base*>(&derivedObject), &Base::signalInBase).
instantate<int, double, bool, char, const char*> inst;
Глянул Вашу либу, с map — интерессная штука. Где-то применяли?
Этот костыль можно было предвидеть. EmptyType был специально оставлен, чтобы приём с рекурсией был более понятен, если с ним кто незнаком.
Но если уже задаваться целью от него избавиться, то тогда уже можно не стесняться:
В том то и дело, что основная цель состоит не в ограничении типов, а в переносе определения шаблона в исходник.
нам с Акакием Ананиевичем тоже очень понравилась статья и, особенно, Ваш интерес к Хабру в свободное от работы время.
Ждём Вас у нас наверху после обеда.
П.С. Постарайтесь не попортить Ивана.
Следующий код работает:
Выдаёт:
3.2
4
auto spy = createSignalSpy(static_cast<Base*>(&derivedObject), &Base::signalInBase).
п.с спасибо за указание на опечатку — исправил
А с советом от Lol4t0 про decay — должно вообще на 110 процентов работать.