- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我们有一个带有默认模板参数的类模板:
template <typename T = int>
class Foo {};
我们可以在函数内部创建变量时省略尖括号:
int main()
{
Foo a; // gets properly deduced as Foo<int>
}
但是我们不能对成员变量这样做:
struct S
{
Foo a; // Deduce Foo<int>
};
我们不能有这样的派生类型:
Foo* ptr; // Foo<int>*
Foo& ref; // Foo<int>&
int Foo::* mem_ptr; // int Foo<int>::*
std::function<Foo(const Foo&)> fn; // std::function<Foo<int>(const Foo<int>&)>
我们不能接受参数并返回它们:
Foo Bar(const Foo&); // Foo<int> (*)(const Foo<int>&)
为什么?这被认为是标准中的错误吗?有修复它的建议吗?省略尖括号是否存在任何实际问题?
我的用例:
我有一个提供默认参数的类模板。模板参数是我自己从未使用过的专家专用功能,但它适用于那些想要完全灵 active 的 1% 的专家。现在对于其他 99%,我想隐藏一个事实 Foo
实际上是一个类模板,但它不起作用,因为用户必须输入 Foo<>
将其声明为成员变量时,当前解决方案是:
template <typename T = int>
class BasicFoo {};
using Foo = BasicFoo<>;
但是这样会使实现代码复杂化,一点也不优雅。
最佳答案
Is this considered a bug in the standard?
没有。
模板是一种命名构造,它根据一组参数生成另一个构造(类/函数/变量)。模板的名称不是它生成的结构的名称。模板的名称只是模板的名称;要命名模板生成的内容,您必须提供模板参数。
Foo
是模板的名称; Foo<>
是由该模板及其关联的模板参数生成的类的名称。
有几个地方,C++ 允许以从一系列表达式中推导出其参数的方式使用模板。但这些都是非常具体的地方,是为方便起见而创建的。它们的存在不是为了隐藏名称代表模板而不是生成的结构这一事实。
Is there a proposal to fix it?
没有任何损坏需要修复。并且目前还没有以这种方式增加变化的提议。
Are there any actual problems with omitting angle brackets?
定义“实际问题”。理论上是否可以更改语言,这样,如果模板的所有参数都是默认的,则可以在没有模板参数的情况下使用模板的名称来同时表示模板和模板生成的内容?
这可能是可能的。但具体说明会复杂。您需要一位认真的规范医生,一个深入了解 C++ 语法的人,才能确定这是否可行,以及具体需要更改哪些内容才能做到这一点。
但归根结底,它只会对一小部分精选模板有用:所有参数都具有默认值的模板。真正的问题是,这种情况是否足够普遍,值得为此付出努力。
关于c++ - 当模板有默认参数时省略尖括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55028330/
我遇到过如下代码: my $string = "fo2345obar"; $string =~ sg; 我不明白尖括号在这种情况下是什么意思;我之前看到的所有替换都是以下形式: $string =~
我正在尝试使用 VBA 计算特定单元格值在 Excel 电子表格中出现的次数。单元格值是一个 XML 标记,尖括号被函数解释为小于/大于。这些字符如何转义? 微软说: "您可以使用通配符、问号 (?)
这个问题在这里已经有了答案: What is the difference between parentheses, brackets and asterisks in Angular2? (3 个回
我正在阅读githab Flux Dispatcher 的源代码并找出尖括号语法: class Dispatcher { .... } 这是该语言的新功能还是像 typescript 一样的子集?这里
在类声明中,<> 尖括号和 swift 中声明的参数有什么用?就像: public class ClassName { } 最佳答案 它使类变得通用。 Swift 标准库没有很多泛型类的示例,但它有一
这个问题在这里已经有了答案: 关闭 9 年前。 Possible Duplicate: printing “” using html 如何在不调用 html 的情况下将 < 符号直接放入 html
为什么我要使用 class 语法: class nil b.foo #=> undefined method 简而言之,class 为给定对象打开一个实例类,允许为给定实例定义额外的实例方法,这些方
在类声明中,<> 尖括号和在 swift 中声明的参数有什么用?像这样: public class ClassName { } 最佳答案 它使类通用。 Swift 标准库没有很多泛型类的例子,但是它有
我正在学习Java,最近被尖括号(<>)难住了。它们到底是什么意思? public class Pool{ public interface PoolFactory{ publ
我正在学习Java,最近被尖括号(<>)难住了。它们到底是什么意思? public class Pool{ public interface PoolFactory{ publ
在“我的查询”中,其他开发人员使用 <> (angle brackets)这是什么意思? sb.append(" AND nvl(VoidFlag, 'N') <> 'Y' "); 最佳答案 <> 运
我正在使用 (Win 10) 捷克语键盘布局 (CES/CS),通常我能够通过右 alt (AltGR + 的组合来编写尖括号“>”。 ) 但现在 Visual Studio 2015 Communi
这个问题在这里已经有了答案: 13年前关闭。 Duplicate: ASP.NET "special" tags 我使用 PHP,它使用 或 作为服务器标签,但是ASP.NET的中的含义和用法是什么?
我是一名优秀的程序员,十分优秀!