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

时间:2012-06-15 19:03:36

标签: c++ templates metaprogramming typetraits

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

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&lt; X&gt; :: 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;
};

我甚至可以将is_base_of或其他过滤器应用于T1 / T2等。所以它 适用于X&lt; T,U&gt; - 至少用g ++ 4.6.7。

1 个答案:

答案 0 :(得分: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;
};

只要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;
};

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


现在在C ++ 11中,您可以使用可变参数模板使extract_value_type使用带有多个模板参数的类模板,例如std::vectorstd::set,{{ 1}}等等。

std::list

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