问题标签 [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.

0 投票
2 回答
2321 浏览

c++ - C++ 函数指针问题

由于某种原因,试图将指向该函数的指针传递给可变参数函数会产生以下错误:

我不确定问题是什么,因为模板函数没有过载,并且模板参数是明确定义的,所以对于哪个函数传递指针是毫无疑问的......

有没有办法解决这个问题,不会为每个参数转换函数创建很多版本,但如果出现错误,仍然可以在异常中包含参数编号?(更好的方法是将参数编号作为参数传递,因此我的 dll 中没有该函数的多个副本。)

编辑:这似乎也导致编译错误。有没有办法创建指向模板函数的函数指针,还是我需要与普通函数不同?

该函数声明为:

EDIT2:添加运营商的地址又给出了另一个不同的错误......

0 投票
4 回答
2311 浏览

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 没有明确说明这一点,我确实使用了我在几个缺陷报告中读到的意图。上面转换的参数列表T1AT由我调用)用作14.8.2.1 “从函数调用中推导出模板参数”的参数列表。

14.8.2.1不再需要转换ATorBT本身(例如,删除引用声明符等),并直接转到14.8.2.4,对于每个A/P对独立地进行类型推导:

  • AT反对T2:。是这里唯一的模板参数,它会发现必须是. 类型推导对于against轻而易举地成功。{ (Q, T), (void*, void*) }TTQATT2

  • BT反对T1:。它会发现is , too here。是一个未推断的上下文,因此它不会用于推断任何内容。{ (Q, T), (void*, typename Const<T>::type*) }TQtypename Const<T>::type*


这是我的第一个问题:现在这将使用Tdeduced 的值作为第一个参数吗?如果答案是否定的,那么第一个模板更专业。这不可能,因为 GCC 和 Comeau 都说第二个模板更专业,我不认为他们错了。所以我们假设“是”,然后void*插入T. 段落 ( 14.8.2.4) 说“对每一对独立进行推导,然后将结果组合起来”以及“但是,在某些情况下,该值不参与类型推导,而是使用推导出来的模板参数的值在别处或明确指定。” 这听起来也像“是”。

因此,对于每个 A / P 对,演绎也成功。现在,每个模板至少和另一个模板一样专业化,因为演绎也不依赖于任何隐式转换并且在两个方向上都成功了。因此,调用应该是模棱两可的。

所以我的第二个问题:现在,为什么实现说第二个模板更专业?我忽略了哪一点?


编辑:我测试了显式特化和实例化,并且在最近的 GCC 版本 ( 4.4) 中都告诉我对特化的引用是模棱两可的,而旧版本的 GCC ( 4.1) 不会出现这种模棱两可的错误。这表明最近的 GCC 版本对函数模板的偏序不一致。

0 投票
3 回答
193 浏览

c++ - 需要默认参数值的模板函数的首选设计是什么?

我目前正在清理一个充满函数模板的 API,并强烈希望编写以下代码。

当我调用这个模板时,我想这样做如下。

不幸的是,第二次调用无法编译,因为编译器无法推断出可选参数的类型。这是不幸的,因为我真的不在乎参数类型是什么,而是它的值是 NULL。另外,我想避免第三次调用的路线,因为它妨碍了可读性。

这导致我尝试使模板参数V具有默认类型,这也不起作用,因为您不能将默认类型应用于函数模板参数(至少使用 VC++ 9.0)。

我唯一剩下的选择是引入一个doWork对模板参数一无所知的重载V

这是解决这个问题的最佳方法吗?我看到的唯一缺点是,如果函数模板包含许多具有合适默认值的参数,我可能会引入许多琐碎的转发函数。

0 投票
3 回答
369 浏览

c++ - 为什么编译器没有在以下示例中选择我的函数模板重载?

给定以下函数模板:

为什么下面的代码总是调用重载#1 而不是重载#2?

鉴于 of 的第二个参数f是 的派生类型Base,我希望编译器会选择重载 #2,因为它比重载 #1 中的泛型类型更匹配。

是否有任何技术可以用来重写这些函数,以便用户可以编写main函数中显示的代码(即,利用编译器推导参数类型)?

0 投票
4 回答
481 浏览

c++ - 如何获取具有给定类名的未知类的对象

我正在寻找一种方法来确定在运行时应该分配哪种类型的对象(基于给定的类名,它是 type const char*)。

好吧,最简单的方法当然是使用大量的ifs / else ifs,但这似乎不适用,因为我有超过 100 个不同的类(至少它们都派生自一个基类),而且我必须定期添加新类以及。

我已经提出了初稿,但遗憾的是它还没有编译(mingw & g++ 4.4)

但这并不能sizeof...(TArgs)>0阻止 gcc 尝试生成get_classobject<TBase,const char*>(const char*)失败的代码

您有任何想法,如何解决此问题或任何其他想法吗?谢谢。

编辑:我解决了:

编辑对于感兴趣的读者:
您现在应该知道上面的实现根本不是独立于编译器的。的输出typeif(sometype).name()是特定于编译器/实现的。在所有派生类中使用static const char* name变量或函数可以解决此问题,但会增加大量工作(当然您可以为此使用宏,但如果您已经在使用宏,您也可以使用另一个对象工厂方法)

0 投票
15 回答
237159 浏览

c++ - 类成员函数模板可以是虚拟的吗?

我听说 C++ 类成员函数模板不能是虚拟的。这是真的?

如果它们可以是虚拟的,那么使用这种功能的场景示例是什么?

0 投票
1 回答
680 浏览

templates - 在模板(非成员)函数中使用模板类中的 typedef

以下无法编译(无论如何,在 Linux 上使用 gcc 4.2.1):

问题在于这一行:

...并且编译器提出了这个抱怨:

foo.c:在函数'void templated()'中:

foo.c:22:错误:预期的 `;' 在“酒吧”之前</p>

通常在没有声明类型时会看到这一点,但据我所知,Foo< T >::FooType 在 templated() 中应该是完全有效的。

0 投票
4 回答
6284 浏览

c++ - C ++中的T类(您的定义)

在 c++ 中使用类 T 的一个优点是减少在函数中重新定义数据类型的时间,如果这些数据类型是在其他函数中定义的,例如 int main。

所以在这种情况下,在没有类T的情况下,对于每一种数据类型,我们都必须添加其对应的数据类型条件,即为int添加另一组if语句,为float添加另一组if语句。

我对么?

0 投票
2 回答
288 浏览

c++ - 函数模板重载:链接错误

我正在尝试重载“显示”方法,如下所示:

然后我用 unsigned char* im1 和 char* im2 调用模板:

这编译得很好,但我得到一个链接错误“未解析的外部符号”:

我不明白我做错了什么!

0 投票
3 回答
159 浏览

c++ - 函数模板

我被告知要创建函数模板,这将需要 4 个参数:

  • 指针
  • 参考
  • 指向数组的指针
  • 函数指针

如何执行此任务?我在尝试:

这给了我“没有匹配的功能,我猜是‘pf’。现在我也无法控制在 pf 中传递什么,或者我错了吗?