我相信我在 boost 中看到了恢复模板模板参数的宏,例如:
template<class>
struct parameters;
#define parameters(T) template<class A> \
struct parameters<T<A> > { typedef A type1; };
有没有这样的,还是我错了?
谢谢
delctype
C++0x 中的支持使得实现起来相当简单:
template<template <typename> class Parent, typename Param1>
Param1 get_type(Parent<Param1> const &input) { return Param1(); }
SomeTpl<int> some_obj;
delctype(get_type(some_obj)) x;
(尽管您需要为具有 2、3、4 等参数的模板单独定义 get_type。)
不幸的是,我认为没有 decltype 就没有办法做到这一点,因为这样做需要函数模板提供的自动类型推导(这对类模板不可用),所以没有办法制作一个 typedef方式。
我不知道 boost 是否已经有类似的东西,但如果他们这样做,仍然需要你的编译器支持decltype
,但由于 decltype 是如此新,所以 boost 中还没有很多东西使用它(虽然有一些)。
我已经学会相信 Johannes 的陈述,所以我有点困惑,因为这似乎用 VC10 为我编译 Ok 并打印出预期的int
:
#include <iostream>
#include <typeinfo>
template< class T >
class steal_it;
template< typename U, template<typename> class C >
struct steal_it< C<U> > {
typedef U result_t;
};
template< typename T >
class foo {};
template< typename T >
void test_it(T)
{
typename steal_it<T>::result_t bar = 42;
std::cout << typeid(bar).name() << '\n';
}
int main(){
test_it( foo<int>() );
return 0;
}
当然,由于我没有检查任何其他编译器,这可能只是 VC 再次愚弄我......