Есть ли хитрость для явного создания экземпляров классовых шаблонов? - PullRequest
1 голос
/ 07 ноября 2019

У меня проблема:

Я хочу явным образом создать экземпляр класса, например Datatype in:

using Layout = some::namespaces::Meat_Layout<Some,Parameters>;
using Datatype = other::namespaces::Meta_Datatype<Layout>;

Для явного создания экземпляра мне нужно использовать разработанные спецификаторы типов. Которые не позволяют использовать typedefs. Поэтому я не могу написать:

template class Datatype;

Но я должен написать:

template class some::namespaces::Meta_Datatype<other::namespaces::Meat_Layout<Some,Parameters>>;

Если там есть какие-либо определения типов, мне тоже придется их заменить, что может привести кчто-то вроде:

template class some::namespaces::Meta_Datatype<other::namespaces::Meta_Meat_Layout<Some,Meta_Parameters<int>,int,int>>;

Как вы видите, это становится очень быстро неясным.

Есть ли какой-нибудь трюк, чтобы избежать деконструкции всех typedefs?

Было бы лучше, если бы также можно было использовать трюк при использовании extern template.

Ответы [ 2 ]

2 голосов
/ 07 ноября 2019

Вам не нужно деконструировать все определения типов. Те, которые используются в качестве параметров шаблона, можно оставить как есть:

using Layout = some::namespaces::Meat_Layout<Some,Parameters>;
using Datatype = other::namespaces::Meta_Datatype<Layout>;

template class other::namespaces::Meta_Datatype<Layout>;
1 голос
/ 07 ноября 2019

На самом деле, вам не нужно деконструировать все определения типов. Это правда, что вы не можете использовать typedef как явно созданный экземпляр шаблона, но вы можете использовать typedef как параметры вашего шаблона, как ранее сказал Evg.

Как вы уже упоминали:

14.7. 2 Явное создание экземпляра [temp.explicit]: Если явное создание экземпляра относится к классу или классу-члену, elaborated-type-specifier в объявлении должно включать simple-template-id.

Но любые ограничения на аргументы шаблонане упоминаются в стандарте, поэтому вы можете свободно использовать любые аргументы в явном экземпляре, включая typedefs.

...