1

我相信我在 boost 中看到了恢复模板模板参数的宏,例如:

template<class>
struct parameters;

#define parameters(T) template<class A> \
          struct parameters<T<A> > { typedef A type1; };

有没有这样的,还是我错了?

谢谢

4

2 回答 2

1

delctypeC++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 中还没有很多东西使用它(虽然有一些)。

于 2010-07-02T19:55:36.010 回答
0

我已经学会相信 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 再次愚弄我......

于 2010-07-02T22:39:55.613 回答