Я работаю с параметрами шаблона шаблона и хочу создать новые типы на основе параметров шаблона шаблона, определенных в другом месте.Иногда это работает, но я думаю, что упускаю что-то принципиально, концептуально.
В приведенном ниже минимальном (надеюсь, не слишком искаженном) примере я ожидаю, что типы Example<GerericTemplate>
и MakeAnotherX<Example<GenericTemplate>>::type
будут идентичными, ноони не всегда
struct Something {};
template <template <typename> typename TemplateParameter>
struct Example {
template <typename T>
using InputTemplate = TemplateParameter<T>;
using FullType = TemplateParameter<Something>;
private:
FullType fData;
};
template <typename T>
struct GenericTemplate {};
// this works with (recent) GCC, but the static_assert below fails with clang
template <typename ExistingType,
template <typename> typename _InputTemplate
= ExistingType::template InputTemplate>
struct MakeAnother1 {
using type = Example<_InputTemplate>;
};
// this compiles, but static_assert below fails for both (recent) gcc and clang
template <typename ExistingType>
struct MakeAnother2 {
template <typename T> using _InputTemplate
= typename ExistingTemplate::template InputTemplate<T>;
using type = Example<_InputTemplate>;
};
#include <type_traits>
int main() {
using type1 = Example<GenericTemplate>;
static_assert(std::is_same<type1, MakeAnother1<type1>::type >::value, "this is not the same");
static_assert(std::is_same<type1, MakeAnother2<type1>::type >::value, "this is not the same");
return 0;
}
этот пример в Godbolt
До сих пор я использую gcc и clang (-std = c ++ 17) для тестирования (и производства), нов общем, я просто хочу иметь стандартный код, соответствующий требованиям.Я действительно хотел бы иметь возможность повторно использовать параметры шаблона шаблона в другом контексте и классах, как описано в минимальном примере выше.
Как правильно достичь этого надежным способом?Также: является ли тот факт, что MakeAnother1 работает с GCC, функцией или ошибкой GCC (и наоборот для clang)?
«Реальный код» значительно сложнее, поэтому, в частности, я хочу, чтобы эти «Make»Помощник структурирует для работы над новыми типами.
Обновление
Более раннюю концептуально идентичную версию этого вопроса задавали около 6 лет назад см. Старое сообщение .Новость заключается в том, что сегодня эта работа на gcc версии 5 и выше, но, похоже, еще ни один другой компилятор не поддерживает ее.К сожалению, обсуждение CWG , похоже, застопорилось по этому вопросу и могло бы принести пользу напоминанием?
На данном этапе: после этого обновления, если вы предпочитаете, мы, конечно, можем закрыть этот отчет здесь и сейчас.Спасибо за помощь!