c++ - 在 C++ 模板中省略空 <>
问题描述
有没有办法<>
在 C++11 中省略一个空来使语法更好,这意味着编写Foo
而不是Foo<>
模板类。
我很清楚我可以重命名/命名空间等。但我想优化掉两个字符,而不是用新名称混淆用户或强迫他输入比以前更多的内容。
完整示例:
template<int N = 1>
class Foo{};
using Foo = Foo<>;
int main()
{
Foo foo; // I want to be able to write this.
Foo<> foo; // Works but is ugly.
}
解决方案
您只有一个选项可以使此语法正常工作,那就是切换到C++17。然后你可以省略模板参数,因为默认模板参数总是可以作为新类模板参数推导的一部分进行推导(有时称为“推导指南”)。
template<int N = 1>
class Foo{};
int main() {
{ Foo foo; }
{ Foo<> foo; }
}
根据您可以做出的权衡,有两种适用于C++11的解决方案。
为别名模板使用不同的名称。
template<int N = 1> class Foo{}; using FooNoArgs = Foo<>; int main() { { FooNoArgs foo; } { Foo<> foo; } }
using
如果您需要访问模板化变体,则将模板移动到其自己的命名空间并结合本地命名空间。namespace foo { template<int N = 1> class Foo{}; } using Foo = foo::Foo<>; int main() { { Foo foo; } { using foo::Foo; Foo<> foo; } }
推荐阅读
- r - 从父目录读取文件时出错
- vba - 如何打印缩小到适合一页的传入电子邮件?
- javascript - 为什么我的选项卡中有时会出现未定义?
- python - 无法调用 API 并在 Python 中获得相应的输出
- r - 从 r 中的均值计算总均值
- java - Android Studio 初学者 :( 此版本中使用了弃用的 Gradle 功能,使其与 Gradle 6.0 不兼容
- javascript - React tile 组件仅在鼠标中键单击后打开链接
- dataframe - Apache Spark:计数与头部(1).isEmpty
- android - 在 PostMan 上运行突变返回“方法不允许”
- javascript - 如何将函数作为道具传递到路由 React js?