在一个模板中,我想将模板参数深入到真正的非模板类型中。因此:
我所看到的唯一解决方案是定义真正的基本类型,例如std::vector<X>::value_type为X。但我很好奇是否有一种方法可以在不在每个目标模板中定义辅助类型的情况下实现这一点。
我看到了类似http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2965.html的东西,但这是草案?而且我不太理解它。
是的,我知道有多重继承,但即使对于简单的情况,这也会很好。
更新:Nawaz的解决方案非常适合我,并且很容易扩展到特定的情况,例如:
我甚至可以对T1/T2等应用is_base_of或其他过滤器,所以它适用于X<T,U> - 至少在g++ 4.6.7中是这样的。
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<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;
};
我甚至可以对T1/T2等应用is_base_of或其他过滤器,所以它适用于X<T,U> - 至少在g++ 4.6.7中是这样的。
std::is_base_of
,但那可能并不完全适合您的目的。 - dirkgently