在模板中,我想将模板参数向下钻取到真实的非模板化类型.所以:
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.