10

In a template, I want to drill down the template parameter to the real non-templated type. So:

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;

The only solution I see is to define real base type like std::vector<X>::value_type is X. But I am curious if there's a way to do this without defining auxiliary types inside each destination template.

I saw something like http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2965.html but this is draft? and I don't quite get it.

Yes I know there's multiple inheritance, but even for simple case this would be nice.

UPDATE: Nawaz solution works for me very well, and it is easy to extend to specific cases, e.g.

template<template<typename, typename> class X, typename T1, typename T2>
struct extract_base <X<T1, T2>>   //specialization
{
    typedef T1 base;
};

I can even apply is_base_of or other filters to T1/T2 and so on. So it does work for X<T,U> - at least with g++ 4.6.7.

4

1 回答 1

12

首先,我们将其称为value_type而不是base,因为value_type似乎更适合描述您要提取的类型的术语。

你可以使用这个:

template<typename T>
struct extract_value_type //lets call it extract_value_type
{
    typedef T value_type;
};

template<template<typename> class X, typename T>
struct extract_value_type<X<T>>   //specialization
{
    typedef T value_type;
};

只要模板参数extract_value_type的形式为Tor ,它就应该起作用X<T>。但是,它不适用于X<T,U>。但是使用可变参数模板在 C++11 中很容易实现它。

将其用作:

template <typename T>
struct MyTemplate
{
    typedef typename extract_value_type<T>::value_type value_type;
};

在线演示:http: //ideone.com/mbyvj


现在在 C++11 中,您可以使用可变参数模板来extract_value_type处理带有多个模板参数的类模板,例如std::vector,std::setstd::list

template<template<typename, typename ...> class X, typename T, typename ...Args>
struct extract_value_type<X<T, Args...>>   //specialization
{
    typedef T value_type;
};

演示:http: //ideone.com/SDEgq

于 2012-06-15T19:11:06.013 回答