问题标签 [template-aliases]

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 投票
1 回答
60 浏览

javascript - 在 testcomplete 中单击 not working using variable

在 testcomplete 中单击 not working using variable 如下。

虽然没有变量的直接点击工作正常,如下所示。

我正在使用 testcomplete 10 和 java 脚本

0 投票
1 回答
168 浏览

c++ - 有没有办法将别名模板推断为模板模板参数,同时仍保留其被推断上下文的属性

过了一会儿,我再次发现了模板模板参数的强大功能。参见例如以下片段:

别名模板作为模板模板参数传递给模板,并在推导出上下文时进一步用于检测模板的其他参数。美丽!

然而,就在需要推断别名模板本身时,编译器似乎变得疯狂:

[现场演示]

编译器当然是正确的,因为TT可以从tag<TT>以及 的TT<T> 参数中推断出来foo,并且int{}不匹配模板模板与类型参数模式。有什么方法可以保留演绎上下文,T但在其中制作TT非演绎上下文TT<T>

PS我的意图是纯粹的,这只是一个理论问题,背后没有Y问题。

0 投票
3 回答
127 浏览

c++ - 为什么模板别名特化取决于引用它的上下文?

考虑这个示例代码:

V<int>::pt是 的别名pt_type<V<int>>。然而,它被定义的事实取决于它被引用的上下文。

C++ 标准在哪里解释了模板参数对模板参数的替换是在引用别名特化的上下文中执行的?

0 投票
2 回答
64 浏览

c++ - 具有不同数量参数的函数的模板别名

我有一个类模板 Foo,它有几个成员,其中一个是 Bar 类型的函数 bar:

我想Bar<2>成为一个函数double (* )(double, double)(或可能std::function<double(double, double)>)的模板别名。同样,我想Bar<3>成为一个函数double (* )(double, double, double)(或可能std::function<double(double, double, double)>)的模板别名。这意味着N应该指定函数 bar 采用的双参数的数量。

我设法接近这种行为的唯一方法是使用模板别名

但是,通过这种方式,我不能bar以自然的方式调用该函数bar(x,y,z)

是否有可能获得我想要的行为?

0 投票
2 回答
77 浏览

c++ - 在 C++11 中没有开销的别名模板最佳替代方案的专业化

我知道不可能专门化别名模板。

事实是,我经常发现以下重复出现的模式:

有时我必须编写许多特化,并且BaseStruct可以有其他模板参数或者可能有一个长名称,所以理想的做法是使用别名然后对其进行特化。

大家遇到这种情况怎么办?我宁愿不使用宏或其他引入开销的方法。

PS我正在使用c ++ 11

0 投票
1 回答
341 浏览

c++ - 模板别名冲突类型。g++ 编译成功,而 clang 失败

我遇到了一个非常奇怪的编译器错误。由于某种原因,发布的代码确实可以使用 g++ (7.3.0) 正确编译,而 clang (7.0.0) 失败:

两个编译器选项都设置为 -std=c++14

根据 cppreference.com:

类型别名声明引入了一个名称,该名称可以用作由 type-id 表示的类型的同义词。它不会引入新类型,也无法更改现有类型名称的含义。类型别名声明和 typedef 声明之间没有区别。此声明可能出现在块作用域、类作用域或命名空间作用域中。

在推导模板模板参数时,别名模板永远不会通过模板参数推导来推导。

据我了解,这两种类型(ConcreteData 和 FieldData)应该是等价的。为什么在这种情况下clang会失败,为什么在使用“第二阶段”别名时两个编译器都会失败?根据 C++ 标准,哪个编译器是正确的?是编译器错误还是对 C++14 标准的微妙含糊解释?

0 投票
2 回答
85 浏览

c++ - 如何为模板类型创建别名?

我有一些模板类,其声明如下所示:

我在以下上下文中使用它们(每个foo*都用Aand实例化,B并且用Cbar实例化):

出于简单和清晰的原因,我希望能够省略A,BC里面的参数bar,只写:

我知道我可以对所有foo类型使用别名模板,如下所示:

但是类型可能很多,foo并且需要为所有类型创建别名。

我试图将所有这些别名放在一个类中:

然后用法如下所示:

但在我看来,这看起来更糟......

是否有可能以其他方式实现这一目标?

0 投票
1 回答
813 浏览

c++ - 如何模拟模板别名的推导指南?

考虑以下:

我们可以提供扣除指南my_array,例如

现在,假设它my_array<T, 2>有一些非常特殊的含义(但只是含义,接口和实现保持不变),所以我们想给它一个更合适的名字:

事实证明,推导指南根本不适用于模板别名,即这会产生编译错误:

我们仍然可以说special<float> b并感到高兴。但是,假设这T是一些冗长乏味的类型名称,例如 eg std::vector<std::pair<int, std::string>>::const_iterator。在这种情况下,在这里进行模板参数推导将非常方便。所以,我的问题是:如果我们真的想special成为(在某种意义上my_array<T, 2>

我提前为一个有点含糊的问题道歉。


我想出了几个解决方案,但都有严重的缺点。

1)special用相同的接口制作一个单独的不相关的类,即

这种重复看起来很尴尬。此外,而不是编写函数,如

我被迫要么复制它们

或做

并且依赖于这些类的接口是相同的。我一般不喜欢这种代码(接受任何东西并完全依赖鸭子打字)。它可以通过一些 SFINAE/概念来改进,但这仍然感觉很尴尬。

2)做special一个功能,即

这里没有类型重复,但现在我不能声明 type 的变量special,因为它是一个函数,而不是一个类型。

3) 保留special模板别名,但提供类似 C++17 之前的make_special函数:

它在某种程度上有效。尽管如此,这不是一个演绎指南,并且将使用演绎指南的类与此make_XXX功能混合听起来令人困惑。

4) 正如@NathanOliver 所建议的,使special继承自my_array

这使我们能够为 提供单独的推导指南special,并且不涉及代码重复。但是,编写如下函数可能是合理的

不幸的是,这将无法接受my_array<2>。它可以通过提供转换运算符 from my_array<2>to 来解决special,但这意味着我们在这些之间进行循环转换,这(以我的经验)是一场噩梦。使用列表初始化时还需要special额外的花括号。


还有其他方法可以模仿类似的东西吗?

0 投票
0 回答
84 浏览

c++ - 尝试理解变量模板和模板别名以正确使用

我之前问过这两个问题:

我的问题与第一个问题中提供的课程有关,这是我的Signal课程。

我试图在课堂上传达的想法是我不希望这个类成为模板。但是,我需要存储一个“时间”相关的变量,但是有两种方法可以存储它;作为整数类型:“离散”或作为浮点类型:“连续”。

我正在考虑使用模板别名来帮助简化代码。从代码中可以看出:

我是如何考虑使用模板别名的。

然后在非模板类本身内。

我有我的模板变量作为 Signal 的成员。现在为了有一个模板变量,它必须是静态的。为了测试这个类,我目前正在使用它的构造函数来实例化一些东西并将其存储到这个变量中。

现在,当访问这个变量时,我有两个选择,我可以使用范围解析运算符通过静态函数访问它,或者我可以通过对象的非静态成员函数访问它。

现在,为了使类能够正确编译和构建,这行代码必须在使用它的其他 CPP 文件中的类之外定义:

这是可以理解的,因为变量是静态成员。

这应该会给你我班级当前结构的背景。在继续添加更多内容之前,我想了解有关此代码设计的几件事。

第一个也是更简单的问题是:我的代码是否要保持原样?这将是检索变量的首选方法:

下一个比上一个更重要的问题,因为这会影响整个设计决策是......

在这种情况下我对模板别名的推理是否正确,我的最初想法或意图如下:

我希望类中的变量模板是 astd::uint64_t或 a double,但我想使用上面的名称:DiscreteTime并将ContinousTime底层类型表示为 typedef。

如果不是,我想看看其他可能的实现。

0 投票
1 回答
68 浏览

c++ - 为什么不能在函数中使用模板别名作为参数并自动推导?

我试图通过使用模板别名而不是基础类型来简化模板函数:

但是调用者需要指定模板类型,因为编译器无法为参数推导出 T:

如果函数参数类型改为std::basic_string<T, Traits, Allocator>代替String调用者可以简单地调用make_vector_from_string(bar);而无需指定模板参数。这是为什么?