问题标签 [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.
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)
。
代码:
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...
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
,但系统不会让我。
c++ - 模板结构和模板成员函数之间的名称冲突
在下文中,GCC 将模板结构与类name
的模板成员函数混淆,而 Clang 编译良好(现场示例):name
A
在此示例中,函数f
显然是要使用类型参数调用的A
,但它可以是其他任何东西,因此f
需要保留模板函数。
我不太在乎哪个编译器是正确的,我只需要一个解决方法,因为我真的不知道除了语法之外的任何语法
调用成员函数,我看不出如何using
应用声明或任何其他消歧方式。
编辑是的,我现在尝试了更明确的语法
这有效,但真的很难看。有什么方法可以使简短的语法起作用吗?否则,最好将两个名称之一更改为...
EDIT2我的原始版本f
适用于通用参考T&&
,需要最丑陋的
万一T
是一个参考......而这一切都是为了一个简单的函数调用。
c++ - 带有向量的 C++ 模板函数
我有以下几行代码和编译错误。应该是我对模板函数的错误理解,或者c++泛型,或者别的什么。提前感谢您指出。
控制台中的编译错误
c++ - 模板:只有在类有方法时才执行方法
我想编写一个函数来执行某些模板类的方法,但如果该类没有它也应该编译得很好。在这种情况下,它不应该调用该函数。
这有可能吗?
c++ - C++ 函数返回不同的数据类型
首先,如果这个问题的标题含糊不清,请允许我道歉。
也就是说,我正在尝试编写一个函数,该函数将根据函数内的条件返回多种数据类型(全部由我定义)中的任何一种。本质上,我想要做的是:
当然,这个例子有点做作,但我认为这明白了我的意思。
A、B 和 C 类都是其他类 S 的子类,但我不想返回 S,因为如果这样做,数据将会丢失。此外,即使返回类型如此重载,功能也不会真正改变,这似乎很愚蠢。那么,这应该是模板函数还是我需要做的其他事情?
谢谢,
c++ - 关于函数模板中的默认模板参数
我知道在 C++11 中可以在模板函数的模板参数中有一个默认值。到目前为止,它只允许用于课程。
我一直认为在 C++11 中的模板参数中设置默认值意味着如下所示
相反,我尝试执行以下操作,相信传统的 C++ 会起作用
我在下面的示例代码中遇到的错误如下
编译器是否试图为模板参数之一设置默认值(尽管语法有点不同)还是我做错了什么?
c++ - 处理未实例化的模板函数
以下代码在 Visual C++ 2013 中编译,但不在 G++ 4.8.2 下:
Visual C++ 似乎忽略了通用模板函数,因为只MyFunc<float>
使用了特化。G++ 无论如何都会解析通用函数,并发现尚未定义 CCodes 枚举。
哪个是对的?还是这个实现定义的?
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?