1

テンプレート テンプレート パラメーターを回復するマクロをブーストで見たことがあると思います。たとえば、次のようになります。

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 を作成する方法がないためです。仕方。

ブーストがすでにこのようなものを持っているかどうかはわかりませんが、もしそうなら、コンパイラが をサポートする必要がありますdecltypeが、 decltype は非常に新しいので、ブーストにはまだそれを使用するものはあまりありません(ただし一部あります)。

于 2010-07-02T19:55:36.010 に答える
0

私は Johannes の声明を信頼することを学んだので、少し混乱しています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 に答える