【发布时间】:2012-06-15 19:03:35
【问题描述】:
在模板中,我想将模板参数向下钻取到真正的非模板类型。所以:
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
我看到了类似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
【问题讨论】:
-
这与继承或基类无关。
-
有
std::is_base_of,但这可能不完全适合您的目的。
标签: c++ templates metaprogramming typetraits