Создать тип, повторно используя параметр шаблона шаблона - PullRequest
0 голосов
/ 24 февраля 2019

Я работаю с параметрами шаблона шаблона и хочу создать новые типы на основе параметров шаблона шаблона, определенных в другом месте.Иногда это работает, но я думаю, что упускаю что-то принципиально, концептуально.

В приведенном ниже минимальном (надеюсь, не слишком искаженном) примере я ожидаю, что типы 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 , похоже, застопорилось по этому вопросу и могло бы принести пользу напоминанием?

На данном этапе: после этого обновления, если вы предпочитаете, мы, конечно, можем закрыть этот отчет здесь и сейчас.Спасибо за помощь!

...