C++ 基于模板类的构造

C++ 基于模板类的构造,c++,C++,我有两个模板类。现在,我想构造一个新变量,该变量的类型与现有变量相同,并且具有基于该变量的模板参数 更具体地说,我有: 模板 福班 { 公众: Foo()=默认值; }; 模板 分类栏 { 公众: Bar()=默认值; }; 这使我能够构建,例如: intmain() { 富富,; 酒吧; 返回0; } 现在,我想分配一个新变量,它要么是Foo要么是Bar,取决于现有变量,并且具有相同的T、不同的N,并且(可选)模板参数的其余部分与现有变量相同。 例如,我想要一个可以构造 Foo 福 我想

我有两个模板类。现在,我想构造一个新变量,该变量的类型与现有变量相同,并且具有基于该变量的模板参数

更具体地说,我有:

模板
福班
{
公众:
Foo()=默认值;
};
模板
分类栏
{
公众:
Bar()=默认值;
};
这使我能够构建,例如:

intmain()
{
富富,;
酒吧;
返回0;
}
现在,我想分配一个新变量,它要么是
Foo
要么是
Bar
,取决于现有变量,并且具有相同的
T
、不同的
N
,并且(可选)模板参数的其余部分与现有变量相同。 例如,我想要一个可以构造

Foo
福
我想到了一个助手函数:

模板
自动构造(X&)
{
返回X();
}
做某事

autoa=construct(foo);
但这让我的编译器不高兴:

error: no matching function for call to 'construct'
    auto a = construct(foo);
             ^~~~~~~~~
note: candidate template ignored: could not match 'type-parameter-0-3' against 2
auto construct(X<T, N, Args...>&)
     ^
1 error generated.
错误:调用“construct”时没有匹配的函数
自动a=构造(foo);
^~~~~~~~~
注意:已忽略候选模板:无法将“type-parameter-0-3”与2匹配
自动构造(X&)
^
生成1个错误。

类型模板参数和非类型模板参数不容易混合。您的
构造
需要一个
模板类X
,即具有1个类型、1个
大小和更多类型参数的模板<代码>Foo
不是这样。如果您将这些修改为
size\t
您的代码将编译:

template <template <typename, size_t, size_t...> class X, 
          typename T, 
          size_t N, 
          size_t... Args>   // <--- Args are size_t not types
auto construct(X<T, N, Args...>&)
{
     return X<T, N + 2, Args...>();
}

// ....

int main() {
   Foo<int, 2, 2> foo;
   Bar<double, 3> bar;

   Foo<int,2+2,2> a = construct(foo);

   return 0;
}

template//In
constrcut
不应该是
,因为模板末尾有数量可变的
size\u t
参数?@NathanOliver这里是的,在我的现实生活中,我不想关心其他模板的类型。也许我可以编辑得更清楚,那不是以前的
Bar
Foo
不起作用,因为
M没有默认值
不幸的是,这是语言中的一个漏洞。您可以使用
some\u type…
获取非类型模板参数,也可以使用
class…
获取类型参数。没有同时接受类型和非类型的泛型
。不,它没有帮助。我也不确定是否有什么能帮上忙。非常感谢!所以我必须对所有的尾随参数进行详细说明?模板化的类会发生什么情况?@TomdeGeus您不能轻易地混合类型参数和非类型参数。您需要像代码中那样的专门化。这是一个相当激烈的限制,尽管根据用例有一些变通方法。例如,您可以考虑使用<代码> STD::TimeAlgIn常量而不是 SiZeStt s,然后是它的所有类型。非常清楚。(尽管令人失望;)