- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 C++20,可以为别名模板生成推导指南(请参阅 https://en.cppreference.com/w/cpp/language/class_template_argument_deduction 处的“别名模板推导”一节)。然而,我无法让它们使用聚合初始化语法。在这种情况下,似乎没有生成别名的扣除指南。
看这个例子:
#include <array>
template <size_t N>
using mytype = std::array<int, N>;
// Deduction guideline ???
int main() {
// mytype error_object = {1, 4, 7}; // ERROR
mytype<3> object = {1, 4, 7}; // OK, but I have to manually specify the size.
return object[0];
}
我曾尝试编写演绎指南,但每次都会出现编译器错误。
template <typename T, typename ... U>
mytype(T, U...) -> mytype<1+sizeof...(U)>; // Compiler error
以及我能想到的任何其他准则。
最佳答案
Is it even possible to have the size of the array alias automatically deduced?
This implementation differs from [the specification] in two significant ways:
1) We include all template parameters of A, not just some.
2) The added constraint is same_type instead of deducible.
mytype
的指南如何生成。
A
):
template <size_t N>
using mytype = std::array<int, N>;
以及来自标准库(
[array.cons] )的推论指南:
template<class T, class... U>
array(T, U...) -> array<T, 1 + sizeof...(U)>;
首先,根据推导指南(
[over.match.class.deduct]/1 )生成函数模板(在标准中称为
f
):
template<class T, class... U>
auto f(T, U...) -> array<T, 1 + sizeof...(U)>;
然后,根据
[over.match.class.deduct]/2 :
the template arguments of the return type of
f
are deduced from the defining-type-id ofA
according to the process in [temp.deduct.type] with the exception that deduction does not fail if not all template arguments are deduced.
array<T, 1 + sizeof...(U)>
中的模板参数来自
std::array<int, N>
.在这个过程中,
T
推导出为
int
;
U
不可推导,因此保持原样。
template<class T, class... U>
auto g(int, U...) -> array<int, 1 + sizeof...(U)>;
然后,我们生成一个函数模板
f'
.
f'
具有与
g
相同的返回类型和函数参数类型. (如果
f
有特殊属性,它们会被
f'
继承。)但值得注意的是,
f'
的模板参数列表包括(
[over.match.class.deduct]/(2.2) ,重点是我的):
all the template parameters of
A
(including their default template arguments) that appear in the above deductions or (recursively) in their default template arguments, followed by the template parameters off
that were not deduced (including their default template arguments), otherwisef'
is not a function template.
N
不出现在推导中,也不包含在模板参数列表中(这是GCC与标准不同的地方)。
f'
有一个约束(
[over.match.class.deduct]/(2.3) ):
that is satisfied if and only if the arguments of
A
are deducible (see below) from the return type.
template<class... U>
requires deducible<array<int, 1 + sizeof...(U)>>
auto f'(int, U...) -> array<int, 1 + sizeof...(U)>;
显然,大小可以推导出为
1 + sizeof...(U)
根据本指南。
deducible
被定义为。
The arguments of a template
A
are said to be deducible from a typeT
if, given a class templatetemplate <typename> class AA;
with a single partial specialization whose template parameter list is that of
A
and whose template argument list is a specialization ofA
with the template argument list ofA
([temp.dep.type]),AA<T>
matches the partial specialization.
template <size_t N> class AA<mytype<N>> {};
所以
deducible
可以声明为:
template <class T> concept deducible = requires { sizeof(AA<T>); };
自
N
可从
1 + sizeof...(U)
推导出,
array<int, 1 + sizeof...(U)>
始终是
mytype<N>
的有效匹配项(又名
std::arrray<int, N>
),因此约束
deducible<array<int, 1 + sizeof...(U)>>
总是很满意。
template<class... U, size_t N>
requires same_type<array<int, 1 + sizeof...(U)>, mytype<N>>
auto f_(int, U...) -> array<int, 1 + sizeof...(U)>;
... 无法推导出
N
.
关于c++ - 如何编写聚合模板别名的推导指南?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64939408/
上下文:我已经在域根上设置了一个用于 GIS 测试和 dokuwiki 的虚拟机服务器。我想在子域上提供 gis Web 应用程序,这样 dokuwiki url 重命名就不会发生冲突(而且感觉更干净
这个问题在这里已经有了答案: If two variables point to the same object, why doesn't reassigning one variable affe
代码如下: Select Branch.BranchName, Sum(Inventory.OnHand) From Inventory, Branch Inventory.BranchNum = B
我的目标是创建一种“Javascript 库”,如果您可以这样调用它的话。我打算在浏览网页时使用它来操作页面,将其作为 greasemonkey 脚本动态加载。这个想法是将“win”映射到window
是否可以在 javascript 中以某种方式为本地变量分配别名/引用? 我的意思是类似 C 的东西: function foo() { var x = 1; var y = &x; y+
SQLite 别名 您可以暂时把表或列重命名为另一个名字,这被称为别名。使用表别名是指在一个特定的 SQLite 语句中重命名表。重命名是临时的改变,在数据库中实际的表的名称不会改变。 列别名用来
我有以下导入(在同一个 TS 源文件中): import {Vector as sourceVector} from "ol/source"; import {Vector} from "ol/lay
我想弄清楚 this 到底是什么行是在这个 github json 项目的 cmake 文件中, add_library(${NLOHMANN_JSON_TARGET_NAME} INTERFACE)
使用集合时如何创建别名 (AS)。 $collection->addAttributeToSelect('total_qty') 可以这样做: $collection->getSelect()->co
这个问题在这里已经有了答案: Pass an argument to a Git alias command (4 个回答) 去年关闭。 我的团队在不同的分支上工作,通常,我需要快速从分支切换来帮助他
我正在寻找一种向我的 vimrc 添加自定义命令或别名的方法,以便快速切换到 Vim 中的不同目录。我曾经设置过一些东西,但丢失了那个配置。这是用于 Linux 设置。 基本上,我想设置一个别名(如果
我使用 Delphi 和 Firebird 1.5 开发了一个应用程序,其中服务器与应用程序位于同一台计算机上。我现在正在将应用程序部署到另一个站点,其中 Firebird 服务器( super 服务
我创建了一个全新的 React 应用 create-react-app demo 我需要为某些目录/组件创建别名,例如: import { Header } from '@uicomponents'
我正在尝试打印有向图,并且不断更改各种节点属性,例如颜色和形状。有什么方法可以使用一次定义并用于多个节点的变量?理想情况下,我想要这样的东西: digraph g { building_color =
server { listen 80; server_name pwta; root html; location /test/{ alia
我想匹配多个数组,并在匹配时构建另一个数组。该键可以在任意数量的数组中匹配,也可以根本不匹配。 [ [{ 'a': 13 }, { 'b': 62 }, { 'c': 93 }, { 'd': 52
经过审查后,我需要更改一些代码并将所有更改代码重新推送到远程分支上。 所以我想使用别名(例如:git repushall)在 git 上自动化这些不同的命令: git add . git commit
我有一个这样的查询: select a1.name, b1.info from (select name, id, status from table1 a) as a1 righ
我想给一些 racket 2htdp 函数/宏起别名,这样我就可以为我的 child 将它们翻译成另一种语言。 我可以简单地用define给函数起别名。我在使用 big-bang 结构时遇到了麻烦;例
经过审查后,我需要更改一些代码并将所有更改代码重新推送到远程分支上。 所以我想使用别名(例如:git repushall)在 git 上自动化这些不同的命令: git add . git commit
我是一名优秀的程序员,十分优秀!