问题标签 [function-templates]
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++ 函数指针问题
由于某种原因,试图将指向该函数的指针传递给可变参数函数会产生以下错误:
我不确定问题是什么,因为模板函数没有过载,并且模板参数是明确定义的,所以对于哪个函数传递指针是毫无疑问的......
有没有办法解决这个问题,不会为每个参数转换函数创建很多版本,但如果出现错误,仍然可以在异常中包含参数编号?(更好的方法是将参数编号作为参数传递,因此我的 dll 中没有该函数的多个副本。)
编辑:这似乎也导致编译错误。有没有办法创建指向模板函数的函数指针,还是我需要与普通函数不同?
该函数声明为:
EDIT2:添加运营商的地址又给出了另一个不同的错误......
c++ - 具有未推断上下文的函数模板的部分排序
在阅读另一个问题时,我遇到了部分排序问题,我将其缩减为以下测试用例
对于这两个函数模板,进入重载决议的特化的函数类型是void(int, void*)
. 但是偏序(根据 Comeau 和 GCC)现在说第二个模板更专业。但为什么?
让我通过部分排序并显示我有问题的地方。可能Q
是一种独特的组合类型,用于根据 确定偏序14.5.5.2
。
- 转换后的参数列表
T1
(Q 插入)(Q, typename Const<Q>::type*)
:。参数的类型是AT
=(Q, void*)
T2
(Q 插入):BT
=的转换参数列表(Q, void*)
,这也是参数的类型。- 未转换的参数列表
T1
:(T, typename Const<T>::type*)
- 未转换的参数列表
T2
:(T, void*)
由于 C++03 没有明确说明这一点,我确实使用了我在几个缺陷报告中读到的意图。上面转换的参数列表T1
(AT
由我调用)用作14.8.2.1
“从函数调用中推导出模板参数”的参数列表。
14.8.2.1
不再需要转换AT
orBT
本身(例如,删除引用声明符等),并直接转到14.8.2.4
,对于每个A
/P
对独立地进行类型推导:
AT
反对T2
:。是这里唯一的模板参数,它会发现必须是. 类型推导对于against轻而易举地成功。{
(Q, T)
,
(void*, void*)
}
T
T
Q
AT
T2
BT
反对T1
:。它会发现is , too here。是一个未推断的上下文,因此它不会用于推断任何内容。{
(Q, T)
,
(void*, typename Const<T>::type*)
}
T
Q
typename Const<T>::type*
这是我的第一个问题:现在这将使用T
deduced 的值作为第一个参数吗?如果答案是否定的,那么第一个模板更专业。这不可能,因为 GCC 和 Comeau 都说第二个模板更专业,我不认为他们错了。所以我们假设“是”,然后void*
插入T
. 段落 ( 14.8.2.4
) 说“对每一对独立进行推导,然后将结果组合起来”以及“但是,在某些情况下,该值不参与类型推导,而是使用推导出来的模板参数的值在别处或明确指定。” 这听起来也像“是”。
因此,对于每个 A / P 对,演绎也成功。现在,每个模板至少和另一个模板一样专业化,因为演绎也不依赖于任何隐式转换并且在两个方向上都成功了。因此,调用应该是模棱两可的。
所以我的第二个问题:现在,为什么实现说第二个模板更专业?我忽略了哪一点?
编辑:我测试了显式特化和实例化,并且在最近的 GCC 版本 ( 4.4
) 中都告诉我对特化的引用是模棱两可的,而旧版本的 GCC ( 4.1
) 不会出现这种模棱两可的错误。这表明最近的 GCC 版本对函数模板的偏序不一致。
c++ - 需要默认参数值的模板函数的首选设计是什么?
我目前正在清理一个充满函数模板的 API,并强烈希望编写以下代码。
当我调用这个模板时,我想这样做如下。
不幸的是,第二次调用无法编译,因为编译器无法推断出可选参数的类型。这是不幸的,因为我真的不在乎参数类型是什么,而是它的值是 NULL。另外,我想避免第三次调用的路线,因为它妨碍了可读性。
这导致我尝试使模板参数V
具有默认类型,这也不起作用,因为您不能将默认类型应用于函数模板参数(至少使用 VC++ 9.0)。
我唯一剩下的选择是引入一个doWork
对模板参数一无所知的重载V
。
这是解决这个问题的最佳方法吗?我看到的唯一缺点是,如果函数模板包含许多具有合适默认值的参数,我可能会引入许多琐碎的转发函数。
c++ - 为什么编译器没有在以下示例中选择我的函数模板重载?
给定以下函数模板:
为什么下面的代码总是调用重载#1 而不是重载#2?
鉴于 of 的第二个参数f
是 的派生类型Base
,我希望编译器会选择重载 #2,因为它比重载 #1 中的泛型类型更匹配。
是否有任何技术可以用来重写这些函数,以便用户可以编写main
函数中显示的代码(即,利用编译器推导参数类型)?
c++ - 如何获取具有给定类名的未知类的对象
我正在寻找一种方法来确定在运行时应该分配哪种类型的对象(基于给定的类名,它是 type const char*
)。
好吧,最简单的方法当然是使用大量的if
s / else if
s,但这似乎不适用,因为我有超过 100 个不同的类(至少它们都派生自一个基类),而且我必须定期添加新类以及。
我已经提出了初稿,但遗憾的是它还没有编译(mingw & g++ 4.4)
但这并不能sizeof...(TArgs)>0
阻止 gcc 尝试生成get_classobject<TBase,const char*>(const char*)
失败的代码
您有任何想法,如何解决此问题或任何其他想法吗?谢谢。
编辑:我解决了:
编辑对于感兴趣的读者:
您现在应该知道上面的实现根本不是独立于编译器的。的输出typeif(sometype).name()
是特定于编译器/实现的。在所有派生类中使用static const char* name
变量或函数可以解决此问题,但会增加大量工作(当然您可以为此使用宏,但如果您已经在使用宏,您也可以使用另一个对象工厂方法)
c++ - 类成员函数模板可以是虚拟的吗?
我听说 C++ 类成员函数模板不能是虚拟的。这是真的?
如果它们可以是虚拟的,那么使用这种功能的场景示例是什么?
templates - 在模板(非成员)函数中使用模板类中的 typedef
以下无法编译(无论如何,在 Linux 上使用 gcc 4.2.1):
问题在于这一行:
...并且编译器提出了这个抱怨:
foo.c:在函数'void templated()'中:
foo.c:22:错误:预期的 `;' 在“酒吧”之前</p>
通常在没有声明类型时会看到这一点,但据我所知,Foo< T >::FooType 在 templated() 中应该是完全有效的。
c++ - C ++中的T类(您的定义)
在 c++ 中使用类 T 的一个优点是减少在函数中重新定义数据类型的时间,如果这些数据类型是在其他函数中定义的,例如 int main。
所以在这种情况下,在没有类T的情况下,对于每一种数据类型,我们都必须添加其对应的数据类型条件,即为int添加另一组if语句,为float添加另一组if语句。
我对么?
c++ - 函数模板重载:链接错误
我正在尝试重载“显示”方法,如下所示:
然后我用 unsigned char* im1 和 char* im2 调用模板:
这编译得很好,但我得到一个链接错误“未解析的外部符号”:
我不明白我做错了什么!
c++ - 函数模板
我被告知要创建函数模板,这将需要 4 个参数:
- 指针
- 参考
- 指向数组的指针
- 函数指针
如何执行此任务?我在尝试:
这给了我“没有匹配的功能,我猜是‘pf’。现在我也无法控制在 pf 中传递什么,或者我错了吗?