Частичный вывод типа C ++ для параметра шаблона — возможно ли это?

У меня есть ситуация, когда у меня есть такие вложенные структуры:

struct A
{
struct B
{};
};

И у меня есть некоторый шаблон кода, который должен знать тип OUTER (в данном случае, ‘A’).
Поэтому я пытаюсь написать шаблонную функцию, которая может выводить внешний тип, и это выглядит так:

template<typename T>
void func(typename T::B item)
{}

int main()
{
A::B item;
func(item);   // Error here because "candidate template ignored: couldn't infer template argument 'T'"return 0;
}

Он не компилируется, и причина указана в комментарии выше.


Теперь я, конечно, мог бы упростить шаблон до чего-то подобного, но, как вы можете видеть ниже, он не удовлетворяет моим требованиям к знанию «внешнего» типа, то есть А.

template<typename T>
void func(typename T item)
{
// Oops, I now have the complete type of A::B but I have a
// specialized function that needs the A without the B as the type parameter
someOtherFunc<???>(...);   // The ??? needs to be type A only, without the B
}

1

Решение

Вы можете добавить typedef A outerType; в ваш класс B.
Тогда реализация func может быть:

#include <iostream>

struct A{
struct B {
typedef A outerType;
};
};

template <class T>
void func( T f)
{
typedef typename T::outerType outerType;
outerType a;
someotherfunc(a);
}

int main ()
{
A::B item;
func(item);

return 0;
}

Тогда, конечно, каждый ваш внутренний класс должен назвать свой внешний тип externalType, чтобы func работал с внешним типом.

3

Другие решения


По вопросам рекламы [email protected]