Это может быть очень глупо ...
Если у меня есть такой шаблон класса А,
template <class T1, class T2>
struct A
{
T1 a;
T2 b;
};
и функция работает на нем,
template <class T1, class T2>
void foo(A<T1, T2> *p)
{
}
теперь я подкласс A,
struct B : A<int, int>
{
};
B b[100];
Не могу вывести параметр шаблона ...
foo(b);
и я должен написать так,
foo((B *)b);
или как это,
foo<int, int>(b);
а теперь еще кое-что,
Я хотел бы, чтобы foo мог принять что-то T кроме A и рассматривать их как A
template <class T>
struct A<T, void>
{
T a;
};
template <class T>
void foo(T *p)
{
foo((A<T, void> *)p);
}
теперь, если я не напишу так, более поздний foo называется ...
foo<int, int>(b);
- Как можно упростить вывод параметров шаблона из массива подкласса?
- Как сделать так, чтобы подкласс имел более высокий приоритет, чем другой класс, при поиске перегруженной функции?
Это, кажется, подойдет
template <class T>
struct is_A_derived
{
typedef char (&yes)[1];
typedef char (&no)[2];
template <class T1, class T2>
static yes test(A<T1, T2> *);
static no test(...);
template <class T1, class T2>
static A<T1, T2> get_type(A<T1, T2> *);
static A<T, void> get_type(...);
template <class T1, class T2>
static A<T1, T2> base_type(A<T1, T2> *);
static int base_type(...); // guess or maybe hope this "int" is never used
static const bool value = sizeof(test((T *)0)) == sizeof(yes);
static const bool identical = value && sizeof(base_type((T *)0)) == sizeof(T);
typedef typename std::conditional<identical, decltype(get_type((T *)0)), A<T, void>>::type type;
};