C ++ boost模板参数特征

时间:2010-07-02 19:32:12

标签: c++ templates boost traits

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

template<class>
struct parameters;

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

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

谢谢

2 个答案:

答案 0 :(得分:1)

C ++ 0x中的

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再次愚弄我......