我可以为int2type <i>?</i>存储模板参数值i

时间:2013-11-15 00:57:07

标签: c++ templates type-erasure

我有各种不同的数据类型。想将它们存储在向量/树(例如数据的目录结构)中,但在某些时候我需要获得真实类型并对实际类型进行操作。例如通过对每个类的成员执行boost :: fusion :: for_each来打印它们。我查看了以下解决方案的选择:

  1. boost :: variant - 有50种类型的限制。我得到的更多,就像数百,可能会增长到数千。
  2. 虚拟+继承 - 我可以有另一个基于类型T构造的接口类,并且存储接口基类,它具有作用于真实类型的虚函数。但是我必须为每个动作编写1个虚函数。双重调度也会变得混乱。
  3. 了解Int2Type习语。我可以做类似的事吗?
  4. 我尝试了以下方法。有什么方法可以从最后一个循环的某个地方传递模板值吗?不知道如何存储。这是一种鸡蛋问题。

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    struct NullType {};
    struct A {};
    struct B {};
    
    template <int i=0>
    struct Int2Class
    {
            typedef NullType Type;
    };
    
    template <> struct Int2Class<1>
    {
            typedef A Type;
    };
    
    template <> struct Int2Class<2>
    {
            typedef B Type;
    };
    
    struct Base
    {
            virtual ~Base() {}
    };
    
    template <typename T>
    struct Data : public Base
    {
            Data() {}
            Data( const T& t ) : t_( t ) {}
            T t_;
    };
    
    template <typename T>
    void ft( const T& t )
    {
            // do something specific to T
    }
    
    int main()
    {
            A a;
            B b;
            Base* d1 = new Data<A>( a );
            Base* d2 = new Data<B>( b );
    
            std::vector<Base*> v;
            v.push_back( d1 );
            v.push_back( d2 );
    
            Data<A>* a1 = static_cast<Data<A>*>( d1 );
            if( a1 ) cout << "yeah\n";
    
            typedef Data<Int2Class<1>::Type>* Type;
            Data<A> *a2 = static_cast<Type>( d1 );
            if( a2 ) cout << "yeah2\n";
    
            for( std::vector<Base*>::iterator i = v.begin(); i != v.end();
    ++i )
            {
                    // for illustration purpose, items in vector is in the order
                    // of the class Id #, or save that as part of a pair in the
                    // vector
    
                    typedef Data<Int2Class<???>::Type>* Type;
                    ft( static_cast<Type>( *i ) );
            }
    }
    

0 个答案:

没有答案