模板类型在实例化时的ctor参数

时间:2010-04-10 22:53:58

标签: c++ templates

template <typename T>
class A
{
public:
   T t;
   void Do (void)
   {
      t.doSomething();
   }
};

在上面,如何在模板实例化时为't'的构造函数提供参数?。

就像,如果我有:

class P1
{
public:
    P1 (int i, int a) {}
};

class P2
{
public:
    P2 (int a) {}
};

我想同时使用P1和P2作为A的模板参数。目前我正在向A的ctor提供P1 / P2的实例,其中't'是使用copy-ctor初始化的。 / p>

更大的图片(对于UncleBens,GMan):

我有很多数据结构(DS),里面有很多恶魔。这些DS中的每一个都存储在数据库中,显示在ui中并通过RPC进行事务处理。我有一个类来验证这些DS中的每一个。验证类的行为应根据其验证的情况而有所不同。当从数据库获取的数据验证失败时,它应该记录“开发人员可理解的”错误并在断言时死亡。当从rpc-client获得的数据验证失败时,服务器应该响应适当的错误。当从rpc-server获得的数据验证失败时,应该记录它并且客户端应该崩溃。在UI上验证失败时,应通知用户。

我决定将'错误处理'作为一个策略,可以在编译时选择作为模板参数。但是,这些错误处理机制中的每一种都需要不同的构造方式。而且,那就是我被困住的地方。

截至目前,我有一个基于复制构造函数的机制,我提到两次类型(一次作为模板的参数,再次作为实例化的实例),这是多余的。

我想知道其他人如何解决这种情况。

2 个答案:

答案 0 :(得分:2)

template <typename T>
class A
{
public:
   T t;
   void Do (void)
   {
      t.doSomething();
   }
   A() : t(parameters) {};  //Like this
}

回应编辑问题:
如果模板化类具有可变数量的参数,则需要等待C ++ 0x varadic模板。

答案 1 :(得分:0)

template <typename T, int i, int a>
class A
{
public:
   T t;
   A() : t(i, a)
   {
   }
   void Do (void)
   {
      t.doSomething();
   }
}

A<MyT, 5, 8> a;

当然,这适用于固定数量的参数。


编辑:
如果没有C ++ 0x,您可能需要为不同数量的参数提供多个模板。


编辑:
如果您的类型不总是int,您可以这样:

template <typename T, typename ARG1, ARG VAL1>
class A
{
    T t;

  public:
    A() : t(VAL1)
    {
    }
};