В шаблоне я хочу развернуть параметр шаблона до реального не шаблонного типа. Так:
template <typename T>
struct MyTemplate
{
// sadly there's no extract_Base
typedef typename extract_base<T>::MyType WorkType;
};
struct X {};
template <typename T> struct Templ {};
//MyTemplate<Templ<X>>::WorkType is X;
//MyTemplate<X>::WorkType is X;
Единственное решение, которое я вижу, - это определить реальный базовый тип, такой как std :: vector ‹X› :: value_type is X. Но мне любопытно, есть ли способ сделать это без определения вспомогательных типов внутри каждого шаблона назначения.
Я видел что-то вроде http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2965.html но это черновик? и я не совсем понимаю.
Да, я знаю, что существует множественное наследование, но даже для простого случая это было бы неплохо.
ОБНОВЛЕНИЕ: решение Nawaz работает для меня очень хорошо, и его легко распространить на конкретные случаи, например
template<template<typename, typename> class X, typename T1, typename T2>
struct extract_base <X<T1, T2>> //specialization
{
typedef T1 base;
};
Я даже могу применить is_base_of или другие фильтры к T1 / T2 и так далее. Так что это действительно работает для X ‹T, U› - по крайней мере, с g ++ 4.6.7.
std::is_base_of
, но это может не полностью соответствовать вашим целям. - person dirkgently   schedule 15.06.2012