Я пытаюсь создать шаблон функции, который будет принимать два (или более) из вложенных шаблонов классов переменных, перечисленных ниже, в качестве аргументов, и помещать их в другую структуру данных, которая будет принимать разные типы (пара или кортеж - вот чтоЯ скорее всего буду использовать).Вот классы и подклассы, наряду с использованием моей функции (функция определена ниже):
template<typename... Args> struct Entity {
template<typename... InnerEntArgs> struct InnerEntity {
InnerEntity(InnerEntArgs... inner_ent_args) {
... //do stuff w/ InnerEntArgs pack
... //do stuff that makes Inner dependent on Outer's Args pack
}
};
};
struct ThingA : Entity<int, string> {
... //construct ThingA
};
struct ThingB : Entity<string, string> {
... //construct ThingB
};
auto foo = my_func(
ThingA::InnerEntity<int, int, int>(1, 2, 3)
, ThingB::InnerEntity<string, int>("bar", 1)
);
Ниже приведен код, который я собрал вместе для функции, и он хорошо компилируется, ноЯ не уверен, правильно ли он настроен.В частности, я немного размышляю о том, как typename
и ::template
делают компилятор счастливым в этом контексте, или если эта функция будет вести себя так, как я ожидаю:
template<
typename... ArgsA, typename... ArgsAInner
, typename... ArgsB, typename... ArgsBInner
> auto my_func(
typename Entity<ArgsA...>::template InnerEntity<ArgsAInner...> A
, typename Entity<ArgsB...>::template InnerEntity<ArgsBInner...> B
) -> tuple<decltype(A), decltype(B)> {
return make_tuple(A, B);
}
I думаю, Я хорошо понимаю, как пакеты / параметры выводятся / выводятся, и как auto
, decltype
, и конечный тип возврата делают свое дело, но если я ошибаюсь, пожалуйста,дайте мне знать, как это сделать.
Кроме того, если кому-то захочется продемонстрировать вариационную версию этой функции, которая может принять любое количество вложенных шаблонов вариационных классов и поместить их в подходящий контейнер или структуру данных, этоотлично, но меня в первую очередь интересует полное понимание typename
и ::template
.Спасибо заранее!
* Если я неправильно сформулировал этот заголовок или я перепутал термины, объясните, пожалуйста.:) Я здесь, чтобы учиться.