Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板类型';s在实例化时的构造函数参数_C++_Templates - Fatal编程技术网

C++ 模板类型';s在实例化时的构造函数参数

C++ 模板类型';s在实例化时的构造函数参数,c++,templates,C++,Templates,我想同时使用P1和P2作为A的模板参数。。目前,我正在将P1/P2的一个实例提供给A的ctor,其中使用复制ctor初始化't' 更大的图景(对于UncleBens,GMan): 我有很多数据结构(DS),里面有很多恶魔。这些DS中的每一个都存储在一个数据库中,显示在ui中,并通过RPC进行事务处理。我有一个类来验证每个DS。验证类的行为应该根据验证的情况而有所不同。当从数据库获取的数据验证失败时,它应该记录一个“开发者可以理解”的错误,并以断言结束。当验证从rpc客户端获取的数据失败时,服务器

我想同时使用P1和P2作为A的模板参数。。目前,我正在将P1/P2的一个实例提供给A的ctor,其中使用复制ctor初始化't'

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

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

我决定将“错误处理”作为一种策略,可以在编译时选择它作为模板参数。然而,每个错误处理机制都需要不同的构造方法。这就是我被困的地方

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

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

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

class P2
{
public:
    P2 (int a) {}
};
甲级 { 公众: T; 无效Do(无效) { t、 doSomething(); } A():t(参数){};//像这样 }
回答编辑后的问题:

如果模板类的参数数量可变,则需要等待C++0x varadic模板。

billy:在模板实例化时。。我想我应该更新我的问题,提到这一点。@Joe Steeve:你已经成为这个班的一员了。当类被构造时,t被构造。如果你想在函数被调用时构造t,就让t成为函数的一个成员并在那里构造它。@billy:我在“a”中有很多函数。A使用“T”中的函数。T基本上定义了一个策略。@Joe Steeve:那么你需要让它们成为模板函数,而不是模板类。C++有一个原因是免费的。这是一个。@billy:如中所述,使用varadic模板收集A的构造函数中的参数并将其传递给“t”的构造函数?在C++03中,不能这样做。我已经更新了我的答案。@Joe你目前的做法有什么问题吗?@neil:模板实例化看起来有点难看。喜欢ax(P2(1));你希望它看起来怎么样?每当人们被你的意图和诸如此类的东西弄糊涂的时候,最好给我们一个更大的图景。告诉我们你想做什么,而不是你认为应该怎么做。47分钟+1。请注意,A中T模板的参数数量必须是已知的。@vlad:你能举个简单的例子吗?@Joe:在C++0x中,你可以有
template
A():T(i…)
。然而,这是一个奇怪的答案。对于一点语法上的甜言蜜语来说,每个a都是不同的类型并不重要。@vlad:ctor的参数并不总是“int”。@UncleBens:OP要求的是:在模板实例化时提供构造函数参数,而不是对象构造!
template <typename T>
class A
{
public:
   T t;
   void Do (void)
   {
      t.doSomething();
   }
   A() : t(parameters) {};  //Like this
}
template <typename T>
class A
{
public:
   T t;
   void Do (void)
   {
      t.doSomething();
   }
   A() : t(parameters) {};  //Like this
}
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;
template <typename T, typename ARG1, ARG VAL1>
class A
{
    T t;

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