C++类型特征提取模板参数类

que*_*en3 8 c++ templates metaprogramming type-traits

在模板中,我想将模板参数向下钻取到真实的非模板化类型.所以:

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;
Run Code Online (Sandbox Code Playgroud)

我看到的唯一解决方案是定义真正的基类型,如std :: vector <X> :: value_type是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;
};
Run Code Online (Sandbox Code Playgroud)

我甚至可以将is_base_of或其他过滤器应用于T1/T2等等.因此,它不会对X <T,U>工作-至少使用g ++ 4.6.7.

Naw*_*waz 10

首先,让我们称它为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;
};
Run Code Online (Sandbox Code Playgroud)

只要模板参数它应该extract_value_type是任一形式的TX<T>.但是,它不适用X<T,U>.但是,使用可变参数模板在C++ 11中实现它很容易.

用它作为:

template <typename T>
struct MyTemplate
{
    typedef typename extract_value_type<T>::value_type value_type;
};
Run Code Online (Sandbox Code Playgroud)

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


现在,在C++ 11,可以使用可变参数模板制作extract_value_type与需要多个模板参数类模板,如工作std::vector,std::set,std::list等.

template<template<typename, typename ...> class X, typename T, typename ...Args>
struct extract_value_type<X<T, Args...>>   //specialization
{
    typedef T value_type;
};
Run Code Online (Sandbox Code Playgroud)

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