4

我有一个模板类


template <class T> 
class myClass
{
    public:
        /* functions */
    private:
        typename T::Indices myIndices;  
};
 

现在在我的主代码中,我想根据条件实例化模板类。喜欢 :


myFunc( int operation)
{
    switch (operation) {
        case 0:
            // Instantiate myClass with <A> 
            auto_ptr < myClass <A> > ptr = new myClass<A> ();
        case 1:
            // Instantiate myClass with <B> 
            auto_ptr < myClass <B> > ptr = new myClass<B> ();
        case 2:
            // Instantiate myClass with <C> 
        ....
    }
    // Use ptr here..
}

现在这种方法的问题是auto_ptr<>switch{}. 而且我不能在函数的开头声明它,因为我不知道预先实例化的类型。

我知道我正在尝试在编译时(使用模板)实现运行时的东西,但仍然想知道是否有更好的方法来做到这一点。

4

5 回答 5

7

创建一个基类

class Base {     
  protected:
      virtual ~Base() {}
      //... functions
};

template <class T> class myClass : Base { 
  //...
};

myFunc( int operation){ 
   shared_ptr < Base >  ptr;

   switch (operation) {        
     case 0:            
          // Instantiate myClass with <A>             
          ptr.reset ( new myClass<A> () );        
     case 1:            
          // Instantiate myClass with <B>             
          ptr.reset ( new myClass<B> () ) ;        
      case 2:            
           // Instantiate myClass with <C>         ....    
     }    
     // Use ptr here..
}
于 2009-11-27T08:33:20.853 回答
4

您可以引入一个公共基础myClass并将其用作auto_ptr. 只是不要忘记将公共基础的析构函数声明为虚拟的。

于 2009-11-27T08:14:42.590 回答
2

Boost.Variant应该可以解决问题。

myFunc( int operation)
{
    boost::variant< myclass<A>, myclass<B> > obj;
    switch (operation) {
        case 0:
            // Instantiate myClass with <A> 
            obj = myClass<A> ();
        case 1:
            // Instantiate myClass with <B> 
            obj = myClass<B> ();
        case 2:
            // Instantiate myClass with <C> 
        ....
    }
    // Use object here..
}

使用对象有点不同,因为类型是动态确定的。apply_visitor 技术绝对是要走的路;请参阅教程以了解如何使用它。

于 2009-11-27T08:28:47.893 回答
1

您可以添加一个间接级别来获得您想要的。您可以避免使用具有虚拟方法的基类并执行任何其他特殊操作。

例如:

template <class T> 
class MyClass
{
    public:
        /* functions */
    private:
        typename T::Indices myIndices;  
};

template<typename T>
static void doit()
{
    MyClass<T> t;
    // Use t here.
}

void myfunc(int op)
{
    switch (op) {
        case 0: return doit<A>();
        case 1: return doit<B>();
        // ...
     }
 }
于 2009-11-27T13:11:01.820 回答
0

低技术解决方案。使用具有所需范围的常规指针。

于 2009-11-27T12:52:54.917 回答