Я хочу, чтобы класс свойств применялся к типу, а также к его потомкам. Это возможно?
template <typename E>
struct Garble {
};
template <typename T>
struct wooble_traits;
template <typename E>
struct wooble_traits<Garble<E>> {
typedef E elem_type;
};
struct IntGarble : public Garble<int> {
};
typedef typename wooble_traits<IntGarble>::elem_type IGType;
//Error, wooble_traits<IntGarble> has no definition.
Есть ли способ вместо этого сказать (заимствование и злоупотребление нотацией Java):
template <typename E>
struct wooble_traits<? extends Garble<E>> {
typedef E elem_type
};
typedef typename wooble_traits<IntGarble>::elem_type IGType;
//Fine, IGType is an alias for int
Примечание.
Попытка адаптировать решение Dyp к моему примеру не работает, поскольку Garble принимает параметр типа. Кажется, нигде нельзя вывести этот параметр.
#include <boost/type_traits/is_base_of.hpp>
template <typename T, typename C = void>
struct wooble_traits;
template <typename T, typename E>
struct wooble_traits<T, typename boost::is_base_of<Garble<E>, T>::type> {
typedef E elem_type;
};
в gcc-4.6 это производит:
g++ -I/usr/include/boost/utility -I/usr/include/boost/type_traits -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o "main.o" "../main.cpp"
../main.cpp:15:8: error: template parameters not used in partial specialization:
../main.cpp:15:8: error: ‘E’
make: *** [main.o] Error 1
что понятно, поскольку у GCC нет возможности узнать значение E.
IntGarble
. подкласс/производный класс. - person Karoly Horvath   schedule 25.03.2014