问题标签 [ctad]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
56 浏览

c++ - 是否可以让 CTAD 接受模板类型别名?

C++ 引入了类模板参数推导所以而不是

我们可以写出更干净的代码

但是,当我们使用相同的模板参数创建类型别名时,由于某种原因,推断失败

我预计它会使用相同的推导方法,但由于某种原因,每个编译器都会抛出一个错误。别名模板和类模板有什么区别,有没有办法让它工作?

0 投票
0 回答
60 浏览

c++ - 如何将用户指定的编译时整数常量添加到可变参数类模板?

我正在尝试编写具有以下功能的某个类。

在外面,我有一组定义类型和成员函数的类:

我想创建一个类模板,它可以包含这些小类的不同组合并在它们上调用一些功能。energy_t要求是此类集合中的所有s 都是相同的。这是第一种方法:

这几乎可以满足所有需求,并且可以使用 CTAD 很好地实例化(这很重要,因为某些参数不是默认可构造的):

问题:目前,唯一检查的是所有energy_t = std::array<double,N>s 都相同。但是,没有具体说明N需要什么数量。这将是构造的“完美”语法:

因为它只是一个明确的陈述:State<3>是一个三重退化状态,{X(), Y(), ...}其部分是就地构建的。

但是,这似乎是不可能的,因为禁止只指定模板参数的一部分。

想到的一件事就是将另一个模板参数添加到构造函数中并继续执行 CTAD,例如

还有其他方法可以解决这个问题吗?

0 投票
1 回答
64 浏览

c++ - 使用 c++17 CTAD 推导函数对象参数

我有很多类型可以使用比较函子,我想看看是否有办法在不传递参数的情况下简化它。这是一个虚拟代码示例:

不幸的是,这不起作用https://godbolt.org/z/q56c3coaT。但后来我想知道 c++17 std::less 是如何工作的,或者有什么办法吗?

0 投票
1 回答
112 浏览

c++ - 为什么 GCC 编译器不能以别名模板形式从 std::array 推导出模板参数之一

在 C++20 中,如果应用别名模板,则可以具有隐式推导指南。

然后,我构建了一个简单的模板别名ints

但:

不起作用,GCC 说:

  • 错误:没有匹配的调用函数array(int, int, int, int)
  • 注意:无法推导出模板参数N
  • 注意:不匹配的类型std::array<int, N>int

我不明白为什么它无法编译。

和:

也不会工作。

  • 是不是因为std::array《推演指南》是用户提供的?
  • 如果上面的答案不正确,那是什么原因呢?

我发现了一个关于这个问题的类似问题:How to write deduction Guidelines for aliases of aggregate templates?.

由此得出结论,按照标准,该代码应该是格式良好的。因此,GCC 可能有不同的实现来阻止此代码编译。

0 投票
3 回答
102 浏览

c++ - C ++中的部分类模板参数推导

我有一个模板类,但只能从构造函数中推断出部分模板参数。

有没有办法在调用构造函数时在尖括号内提供其余的模板参数?

假设我们使用的是 C++17。

据我所知,我们需要在尖括号中提供所有模板参数,或者不提供任何模板参数并使用 CTAD。问题是我不想编写所有模板参数(在我的实际用例中,它们有 5-6 个,它们非常冗长)但我也不想在构造函数中传递所有参数,因为其中一些不用于构造对象。对于 operator() 方法,我只需要它们的类型。

我无法将 operator() 方法模板化,因为我想将它绑定到 std::function 对象,并且我无法在绑定期间推断模板参数类型。所以这就是为什么我需要包装类中的所有类型。

这种部分模板推导存在于函数中。

例如:

我目前的解决方案是利用此功能并通过函数构造对象:

我发现这个解决方案很笨拙,因为我们使用外部函数来构造对象。

我想知道是否有更清洁的解决方案可以做到这一点。

也许有扣除指南的东西?我不确定。

0 投票
0 回答
45 浏览

c++ - 类模板参数推导指南中的 std::reference_wrapper?

这接近于代码审查/最佳实践,但是……这样做是否合理?

也就是说,如果你有int x并且打电话S(std::ref(x)),我们会假设你想要一个S<int&>. 这看起来优雅、简单、明确,但又有点神奇。

https://godbolt.org/z/r7KqGKnsf

0 投票
1 回答
83 浏览

c++ - clang vs gcc - 从模板参数派生的结构的 CTAD

考虑以下代码:

  • gcc 12.x 接受它并推断dD</* type of lambda */>预期的那样。

  • clang 14.x 拒绝它并出现以下错误:

godbolt.org 上的实时示例


哪个编译器在这里表现正确?

0 投票
1 回答
92 浏览

c++ - 类模板参数推导 - 为什么它在这里失败?

为什么以下 CTAD 尝试编译失败?

我原以为会推导出构造函数 C(int) 。

0 投票
1 回答
94 浏览

c++ - C++ - 为什么聚合初始化不适用于模板结构

此代码有效,无需指定构造函数:

如果我将 Foo 设为模板,则它不起作用。

它说扣除失败/提供了 2 个参数,而预期有 1 个。如果我添加一个这样的构造函数,Foo(T1, T2){}它就可以工作。我想,这种结构默认情况下只适用于结构。我怎么了?

编辑:我正在使用 Clang,这似乎不支持它。MSVC 和 GCC 都使用 c++20 编译器标志编译它。

0 投票
0 回答
64 浏览

c++ - 容器的默认模板参数扣除

我在下面有这段代码我无法理解我从我正在使用的教程中复制的内容 -

要初始化 myIntVec 我需要指定 int 为什么不能从参数推断为 Int 因为模板定义为 -

模板 <typename T, template <typename, typename> 类 Cont = std::vector > ?

和 Cont = Cont<T, std::allocator> 数据;

所以它可以从构造函数的参数中获取 T is int 那么为什么它也不能定义数据,因为它使用相同的 T 参数?

另外,为什么只需要在 - 中指定 int