Ну, я не собирался отвечать на свой вопрос, но я думаю, что за последние несколько дней я ударился головой о стену достаточно, чтобы понять это ... и, конечно, узнал кое-что новое.кстати (нареканий нет).Это немного гадкий утёнок (метафункции черт типа SFINAE + шаблоны функций variadic), но я выполнил несколько простых тестов, и, похоже, он работает как ожидалось.типы, передаваемые в любые вариации Inner для любых вариаций Outer.Я думаю, что это делает то, что я искал, по крайней мере, так кажется.
Мое понимание того, как все это работает, заключается в следующем, пожалуйста, исправьте при необходимости:
Серия Inner
объекты передаются внутрь. Каждый Inner
объект имеет typedef, ссылающийся на его тип 'Outer
.Мы удаляем один объект Inner
из пакета параметров и проверяем typedef, ссылаясь на его тип 'Outer
, чтобы убедиться, что он соответствует ожидаемому типу Outer
.Если он совпадает, то мы берем пакет параметров, использованный в первом переданном объекте Inner
, и передаем пакет вместе с шаблоном Inner
, на который мы ссылаемся через определение типа Outer
, на которое ссылается первый Inner
.Затем мы проверяем эти два Inner
друг против друга, чтобы убедиться, что они одинаковы.Если они есть, то это конкретное создание экземпляра шаблона функции включено.
Сам шаблон функции variadic просто вызывает себя рекурсивно, так что все объекты в пакете параметров имеют те же проверки на них, пока у нас не закончатся аргументы, который вызывает пустую версию функции.Наконец, каждая рекурсия вызывает (в данном случае) функцию, которая объединяет объекты в список.
В одном я не уверен, что компилятор оптимизирует все эти вызовы make_listкоторые возвращаются в небытие, кроме последнего, который выполняется первым вызовом mystery_func()
, и единственный, который имеет целенаправленное возвращаемое значение.
В любом случае, улучшения, комментарии и упрощения наиболееприветствуется.