问题标签 [template-argument-deduction]
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.
c++ - 模板推论:为什么它适用于继承(当它转换失败时)?
我试图理解我观察到的 C++ 语言行为(我理解了它的前半部分)。
我的设置:2 个模板类:A
和C
. A
可以转换为C
但不能反过来。它们有一些共同的行为,所以我正在寻找仅使用C
并依赖于转换A
来实现一些逻辑C
来使A
行为与C
.
示例使用运算符重载,但我认为讨论与函数或方法相同。
我首先尝试的是使用转换构造函数:
这实际上是我在搜索SO和网络后认为我理解的前半部分。根据我收集的信息,模板参数必须完全匹配,然后才能尝试转换,在这种情况下,如果不考虑可能的转换就无法推断,因此无法推断。C
如果操作员成为非模板朋友(但我不喜欢它),则可以避免这种情况。
我尝试的下一件事是使用继承:
为此我在网上没有找到解释(也许我不知道如何搜索)。
我的问题是为什么可以推断模板何时A
可转换为,C
因为是C
(第二种情况)的基类,但不能推断出何时A
可转换为C
(第一种情况)?
编辑
正如我尝试过的评论中 KerrekSB 所建议的那样:
我的第一个案例(转换,而不是继承)
在这种情况下:
我认为使用他的答案c1 < a1
是可行的,因为第二个参数不是演绎过程的一部分,因此第二个参数考虑了隐式转换。
我也试过:
这甚至不适用于c1 < c2
. 我认为这是因为现在推演过程中不涉及任何参数。
我对吗?
c++ - 为什么 gcc 不能为我的函数模板推断出正确的类型?
vs2013:好的!
c++ - C++11、静态方法中派生类的类型推导
最小的例子:
工厂方法的make
存在使我不必在实例化模板化派生类时提供所有模板类型。
我希望能够尽可能简洁地创建 MyTask 的实例,即:
但是,编译器坚持认为它不能推导出 T,而是想要:
这不是一个巨大的交易破坏者,但重复似乎是不必要的。有没有办法按照我想要的方式得到它?
c++ - 哪个 foo 模板将被实例化?
鉴于此代码:
我有上面的 c++ 程序,我只是想知道,根据标准中规定的规则,两个“foo”模板中的哪一个将被实例化用于 main.js 中的“foo”调用。
c++ - 创建与推导参数具有相同类型的局部变量的最简单方法是什么?
即:
到目前为止,我正在使用:
但我真的希望有一个更简单的选择!
c++ - 使用可变数量的模板化参数访问模板化类的成员
我有一个带有可变数量的模板化参数的模板化类。在这些情况下(我买不起 C++11),一个好的做法是创建一个我们调用的默认类none
并将其设置为默认类,如下所示。
在这个阶段,我不知道如何实现可以访问每个模板化参数的通用/模板化访问器函数。
所有的模板化参数都是不同的,所以我为每个模板化参数专门化了 A::extract()。
有没有更好的方法来做到这一点?我可以看看任何类型的标签吗?
c++ - C++ 模板:向编译器提示模板参数?
我有以下类定义:
有没有办法可以以某种方式向编译器提示这一点(并断言不正确的输入?)
c++ - 将函数作为模板类型传递并在 C++ 中扣除其类型
如何简化此代码?我想写代码作为评论中的代码。C++11 result_of 和 decltype 似乎有帮助,但我不够聪明,无法编写正确的代码来推断类内函数 f 的输入和输出类型。你能帮我看到光吗?谢谢
c++ - 与 sizeof(T) 混淆的整数类型
我得到了上面的类,现在我想给它添加一个重载,operator>>
这样我就可以做到:
所以我创建了这个重载函数:
但我不确定它是否有效,因为整数类型被转换成int
然后搞砸了sizeof(T)
c++ - 什么是非演绎上下文?
我最近偶然发现了“为什么模板参数推导在这里不起作用? ”,答案可以总结为“这是一个非推导的上下文”。
具体来说,第一个说它是这样的,然后重定向到“详细信息”的标准,而第二个引用标准,至少可以说是神秘的。
有人可以向像我这样的凡人解释什么是非推断上下文,它何时发生以及为什么会发生?