问题标签 [template-function]

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 投票
3 回答
2936 浏览

c++ - 为什么 C++11 不将 lambda 隐式转换为 std::function 对象?

我实现了一个通用的事件发射器类,它允许代码注册回调,并发出带有参数的事件。我使用 Boost.Any 类型擦除来存储回调,以便它们可以具有任意参数签名。

这一切都有效,但由于某种原因,传入的 lambda 必须首先转换为std::function对象。为什么编译器不推断 lambda 是函数类型?是因为我使用可变参数模板的方式吗?

我使用 Clang(版本字符串:)Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)

代码:

0 投票
4 回答
992 浏览

c# - Template functions and types in C#

Hello I am having some difficulty with setting up a class , because of the types involved. Here is the Idea:

class A has a private arraylist which is supposed to be filled with instances of class B. So any instance of class A will have its on ArrayList of class B elements. class A has a function to add to its ArrayList a new instance of B. To be more specific, inside the A.Add, a new B is instantiated, and initialized, then added to the ArrayList. class B is a very simple class: It has one enum Type in it, and it should also contain a reference to an external object/class or whatever. Suppose there are classes * appleClass, peachClass , lemonClass * and classB is the fruit class, and class A is the fruitBasket. The everytime the main code sees a fruit, it should ask class A to add it in the basket. that means, A.add(thisfruit), but this fruit might be any of the fruitclasses. which in turn means that I need a generic signature to instantiate classB , and add it to A.arraylist. I don;t know if I make any sense but I will also try to give some code to explain my problem.

SomeHow I should use templates?? I know the code above is wrong, but I can't figure how is this best done.

Thank You

Alex

EDIT Thank You all for your answers. They all seem to point to using a base/abstract class Fruit, and derive specific fruits from it. I am sorry to tell you that my actuall project doesn't involve fruits, I just used them for simplicity. The actual project is in Unity and somr of the "fruits" are coming from Unity classes , some other "Fruits" are my own classes. this means that I can't declare parent class for the ones that come from Unity's namespace. I was more hopeing to be able to have a generic reference to the "fruit" , that would be a void pointer in good old C. I know C# is strongly typed, and won't allow most pointer-like uses, but there must me a way to pass an "unknown" reference-to-object to a class/function and use/resolve it later...

0 投票
4 回答
582 浏览

c++ - 使非 constexpr 整数值适应非类型模板参数和代码膨胀

F考虑一个带constexpr size_t参数的函数对象I

包裹在 typesize <I>中,其中(为简洁起见)

当然,我们可以I直接传递,但我想强调它是 constexpr,将其用作模板参数。函数F在这里是虚拟的,但实际上它可以做各种有用的事情,比如从I元组的第 th 元素中检索信息。F假定无论I. I可以是任何整数类型,但假定为非负数。

问题

给定一个constexpr size_t值,I我们可以调用F

现在,如果我们想F用非 consteprsize_t值调用i怎么办?考虑以下:

(我为什么需要这个?为了给出一些上下文,我实际上是在尝试将复合迭代器构建到一个容器视图中,该视图表示一系列“连接”(连接)异构容器。这将能够说出类似join(a, b) = c;where数组join(a, b)c长度相等。但是,i迭代器状态是不是这样constexpr,但子迭代器存储在元组中,需要通过constexpr索引访问。个体value_type的大致一致,因此连接视图可以采用它们的 common_type类型,但是子容器和子迭代器是不同的类型。)

解决方案

在这里,我提出了 struct idx <F, L>,它为此目的调整函数F,假设输入参数小于L. 这实际上可以很好地编译输出

这是一个活生生的例子

idx通过递归地将输入分解i为二进制表示并重建 constexpr 对应项来工作N

其中R表示2当前迭代的幂。为了避免无限的模板实例化,对 进行了专门化N >= L,返回F()(size <0>())一个虚拟值:

事实上,这种方法是更常见的带有布尔参数的成语的概括:

其中f是一个将 abool作为模板参数的函数。在这种情况下,很明显所有两个可能的版本f都被实例化了。

问题

尽管这可行,并且它的运行时复杂性可能是对数i,但我担心编译时的影响,例如:

  • 有多少idx和 它的组合template operator()被实例化,以便在运行时为i编译时未知的任何输入工作?(我再次理解“所有可能”,但有多少?)

  • 真的可以内联operator()吗?

  • 是否有任何“更容易”编译的替代策略或变体?

  • 我应该忘记这个想法作为纯代码膨胀的实例吗?

笔记

以下是我针对不同值测量的编译时间(以秒为单位)和可执行文件大小(以 KB 为单位)L

因此,尽管它在 中看起来大致呈线性L,但它相当长且大得令人沮丧。

尝试强制operator()内联失败:可能被 Clang 忽略(可执行文件更大),而 GCC 报告recursive inlining.

在可执行文件上运行nm -C,例如 for L = 160,显示511/1253不同版本的operator()(使用 Clang/GCC)。这些都是为了N < L,所以看起来终止的专业化N >= L确实被内联了。

附言。我会添加标签code-bloat,但系统不会让我。

0 投票
3 回答
647 浏览

c++ - 模板结构和模板成员函数之间的名称冲突

在下文中,GCC 将模板结构与类name的模板成员函数混淆,而 Clang 编译良好(现场示例):nameA

在此示例中,函数f显然是要使用类型参数调用的A,但它可以是其他任何东西,因此f需要保留模板函数。

我不太在乎哪个编译器是正确的,我只需要一个解决方法,因为我真的不知道除了语法之外的任何语法

调用成员函数,我看不出如何using应用声明或任何其他消歧方式。

编辑是的,我现在尝试了更明确的语法

这有效,但真的很难看。有什么方法可以使简短的语法起作用吗?否则,最好将两个名称之一更改为...

EDIT2我的原始版本f适用于通用参考T&&,需要最丑陋的

万一T是一个参考......而这一切都是为了一个简单的函数调用。

0 投票
3 回答
11240 浏览

c++ - 带有向量的 C++ 模板函数

我有以下几行代码和编译错误。应该是我对模板函数的错误理解,或者c++泛型,或者别的什么。提前感谢您指出。

控制台中的编译错误

0 投票
1 回答
242 浏览

c++ - 模板:只有在类有方法时才执行方法

我想编写一个函数来执行某些模板类的方法,但如果该类没有它也应该编译得很好。在这种情况下,它不应该调用该函数。

这有可能吗?

0 投票
1 回答
747 浏览

c++ - C++ 函数返回不同的数据类型

首先,如果这个问题的标题含糊不清,请允许我道歉。

也就是说,我正在尝试编写一个函数,该函数将根据函数内的条件返回多种数据类型(全部由我定义)中的任何一种。本质上,我想要做的是:

当然,这个例子有点做作,但我认为这明白了我的意思。

A、B 和 C 类都是其他类 S 的子类,但我不想返回 S,因为如果这样做,数据将会丢失。此外,即使返回类型如此重载,功能也不会真正改变,这似乎很愚蠢。那么,这应该是模板函数还是我需要做的其他事情?

谢谢,

0 投票
0 回答
44 浏览

c++ - 关于函数模板中的默认模板参数

我知道在 C++11 中可以在模板函数的模板参数中有一个默认值。到目前为止,它只允许用于课程。

我一直认为在 C++11 中的模板参数中设置默认值意味着如下所示

相反,我尝试执行以下操作,相信传统的 C++ 会起作用

我在下面的示例代码中遇到的错误如下

编译器是否试图为模板参数之一设置默认值(尽管语法有点不同)还是我做错了什么?

0 投票
1 回答
208 浏览

c++ - 处理未实例化的模板函数

以下代码在 Visual C++ 2013 中编译,但不在 G++ 4.8.2 下:

Visual C++ 似乎忽略了通用模板函数,因为只MyFunc<float>使用了特化。G++ 无论如何都会解析通用函数,并发现尚未定义 CCodes 枚举。

哪个是对的?还是这个实现定义的?

0 投票
1 回答
678 浏览

c++ - Tagged dispatch with variadic templates, c++11

I'm trying to make a function accept different arguments depending on the enum.

.cpp file contains the specialisations of the function

For completeness

Another file that includes cake.h

Compile with clang++ -Wall -Wextra -std=c++11 main.cpp other.cpp -o main

I've tried putting in declarations

and still can't get that template instantiated. If I move the specialisations into the header then they'll cause redefinition when the header is included in multiple compilation units at the link stage.

My question is: How can I get this to work, or is there a better way of doing this?