gpt4 book ai didi

c++ - 当模板有默认参数时省略尖括号

转载 作者:行者123 更新时间:2023-11-30 01:03:01 24 4
gpt4 key购买 nike

假设我们有一个带有默认模板参数的类模板:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com