C ++ параметры шаблона буста - PullRequest
1 голос
/ 02 июля 2010

Мне кажется, я видел макрос в boost, который восстанавливает параметры шаблона шаблона, например:

template<class>
struct parameters;

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

есть такой или я ошибаюсь?

Спасибо

Ответы [ 2 ]

1 голос
/ 02 июля 2010

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;

(хотя вам нужно отдельное определение get_type для шаблонов с параметрами 2, 3, 4 и т. Д.)

К сожалению, я не думаю, что есть способ сделать это без decltype, потому что для этого требуется автоматическое удержание типа, обеспечиваемое шаблонами функций (которое недоступно для шаблонов классов), и поэтому нет способа сделать typedef таким образом.

Я не знаю, если в boost уже есть что-то подобное, но если они это сделают, все равно потребуется ваш компилятор для поддержки decltype, но поскольку decltype настолько нов, в boost не так уж много вещей который использует это еще (хотя есть некоторые).

0 голосов
/ 03 июля 2010

Я научился доверять заявлениям Йоханнеса, поэтому я немного запутался, так как это, кажется, компилирует Ok для меня с 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 дурачит меня снова ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...