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上验证失败时,应通知用户。
我决定将'错误处理'作为一个策略,可以在编译时选择作为模板参数。但是,这些错误处理机制中的每一种都需要不同的构造方式。而且,那就是我被困住的地方。
截至目前,我有一个基于复制构造函数的机制,我提到两次类型(一次作为模板的参数,再次作为实例化的实例),这是多余的。
我想知道其他人如何解决这种情况。
答案 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)
{
}
};