我相信我在boost中看到了恢复模板模板参数的宏,例如:
template<class>
struct parameters;
#define parameters(T) template<class A> \
struct parameters<T<A> > { typedef A type1; };
有这样的人,还是我错了?
谢谢
答案 0 :(得分:1)
delctype
支持使得实现起来相当简单:
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中(虽然有一些)。
答案 1 :(得分:0)
我已经学会了相信约翰内斯的陈述,所以我有点困惑,因为这似乎用VC10为我编译好了并打印出预期的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再次愚弄我......