有没有办法使用默认模板参数而不必在C++中使用<>?
Is there a way to use a default template argument without having to use <> in C++?
我有一个正在某处使用的结构体,声明为:
struct Foo
{
someArray[64];
//...other stuff
};
它在许多地方被广泛使用,我想把它改成:
template <size_t N = 64>
struct Foo
{
someArray[N];
//...other stuff
};
,因为在一个地方(确切地说是四个地方),这个结构体需要与一个128字节的数组一起使用以确保正确性,但它为所有其他用途带来的损失是不值得付出的。在提供默认模板参数时,我希望它能透明地通过,除了那些需要更广泛的内部数组的人,然后声明Foo<128>
。不幸的是,它似乎迫使它的每次使用都说Foo<>
。有办法解决这个问题吗?
在实例化类模板时不能省略尖括号。
然而,你可以给你的Foo
类模板一个不同的名字(比如FooN
),然后提供一个类型别名,如:
typedef FooN<> Foo;
这样,使用Foo
的原始非模板版本的客户端将不必更改,并且需要覆盖默认N
的灵活性的客户端可以使用泛型类模板:
FooN<128> obj;
首先回答这个问题:没有<>
就没有办法使用它。但是,这并不意味着你不能做其他事情来保持你的代码库完整。
最简单的解决方案是将模板化的变体重命名为其他东西,并为名称Foo
提供Typedef:
template <size_t N = 64>
struct GenericFoo
{
someArray[N];
//...other stuff
};
typedef GenericFoo<64> Foo;
这样,您可以在所有其他实例中继续使用Foo
,并且在需要细粒度控制时可以选择使用GenericFoo<Whatever>
。
namespace generic
{
template <int N> class Foo {};
}
// user code
typedef generic::Foo<64> Foo; // common users
// OR
using generic::Foo; // rare users
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 如何显式调用运算符<<
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- 为什么“操作员”需要const但不是为“运营商&lt;”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 左角支架解释为操作员&lt;而不是模板参数
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- 超载操作员&lt;&lt; - 必须是二进制操作员
- 没有匹配的“运营商&lt;&lt;”