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

0 投票
7 回答
2893 浏览

c++ - 推导非类型模板参数

是否可以从模板函数参数中推断出非类型模板参数?

考虑这个简单的模板:

我希望能够进行更改factorial,以便我可以这样称呼它:

并让编译器在编译时计算出 N 的值。这可能吗?也许加上一些花哨的 C++11?

0 投票
2 回答
461 浏览

c++ - 用两个以上的参数推导 std::function

我想知道为什么std::function只知道两个参数的功能。我编写了一些运行良好的代码,但有许多限制。欢迎任何反馈。特别是,我怀疑我正在重新发明轮子。

我的代码在ideone上,我会参考它。

例如,我可以用以下方式描述类型main

(其中“i”表示“int”,“PPc”表示指向字符的指针)

标准std::function不适用于具有两个以上 args 的函数(请参阅我的代码的最后两行),但此代码可以(示例代码演示了三个 arg 函数)。也许我的设计应该在标准库中使用!我定义typedef tuple<Args...> args_as_tuple;存储所有参数,而不仅仅是前两个参数类型。

主要技巧是在这个函数中的推导:

限制:

  • 它不适用于 lambda。这不会编译function_type_deducer([](){}).describe_me();
  • 它没有注意到xand 和yasy需要 astring&和 wherex需要 a之间有细微的差别string。(std::function 也没有注意到这一点)

关于如何解决这些问题的任何想法?我重新发明了轮子吗?

0 投票
3 回答
5023 浏览

c++ - 模板参数推导

我目前面临一个我自己无法解决的问题。基本上我想要做的是在 C++ 中实现一些类似 linq 的行为。

我将从标题中的代码开始:

这就是我希望它被实例化的方式:

不用说这不起作用(否则我不会在这里:))

现在更奇怪的是,即使这样似乎也不起作用:

正如你所看到的(通过查看 select 函数),对我来说重要的是不要只使用这样的东西:

关于如何解决这个问题的任何建议?这甚至可能吗?

任何帮助,将不胜感激!

编辑:我得到的错误:

编辑2:

据我了解,编译器抱怨 C 不采用 2 个类参数,而是 1 个类参数和 1 个模板化类参数 (1),因为我将 C 定义为那样。有没有办法解决这个问题?

0 投票
4 回答
20320 浏览

c++ - 使用强类型枚举的模板参数推导

如果我有一个普通(弱)枚举,我可以将其枚举值用作非类型模板参数,如下所示:

并将其称为:magic<Cat>(t)

据我所知,如果我有一个强类型枚举并且不想对枚举类型进行硬编码,我最终会得到:

现在我必须写: magic<Animal, Animal::Cat>(t),这似乎是多余的。

有什么办法可以避免同时输入枚举类和值,短

0 投票
1 回答
576 浏览

c++ - C++ 指向方法的指针模板推导在针对 x86 时无法编译,但适用于 x64

我有这个示例代码:

这与g++. 它也可以与 VC10 一起编译,但仅限于为 64 位平台构建时。当我为 32 位平台构建时,我得到这个编译错误:

该错误表明正在使用非专业版本的 Gobstopper,这一定Signature意味着int (void). 但错误也清楚地说Signature int (void)。那么错误从何而来?我该如何解决?

我唯一能想到的可能会从 32 位更改为 64 位并且不会出现在错误消息中显示的签名中的是调用约定;显然,VC x64 有一个统一的调用约定,而对于 x86,每个调用约定都是不同的。但即使这是问题所在,我也不知道如何解决它。

编辑:我应该提到我用常规(非成员)函数指针尝试了这个,效果很好。

0 投票
1 回答
290 浏览

c++ - 参数替换的 C++ 规则

使用 boost scoped_ptr 的 C++ 多态性之后,我想了解 C++ 参数推导的规则。例如:

  1. 使用智能指针和容器时的 C++ 多态替换规则
  2. 常量和非常量参数之间的自动转换
  3. 什么时候可以将临时对象作为参考传递?
  4. 模板参数推导的规则有何不同。

如果标准中有相关部分,您可以指出这也会有所帮助。

0 投票
1 回答
909 浏览

c++ - 成员函数 & const 成员函数指针推导

我有以下代码:

它运作良好,但我不想为 const 和非常量成员函数指针有 2 个不同的函数。所以问题是:有没有办法合并 void foo(T&, const std::function<Ret()>&)一个void foo(T&, Ret(T::*)() const)函数?请注意,std::function合并后也应参与解决的重载。我需要一些只接受成员函数指针的函数。所有其他的都将进入std::function版本。

0 投票
2 回答
672 浏览

c++ - int a[5]和int(&a)[5]在模板参数推导中的区别

这个问题是关于采用静态已知大小的数组的函数。

以下面的最小程序为例:

运行时,它会打印预期的结果:

但是,当我尝试让我的编译器(VS 2010)推断5could not deduce template argument for 'int [n]' from 'int [5]'.

一些研究导致arrfun_b模板参数推导工作的更新:

arrfun_a无论调用还是arrfun_b调用,程序的结果都是一样的。

到目前为止,我发现的唯一区别是模板参数推导是否有效,以及是否可以使用不是 5 的 N 调用函数......

0 投票
3 回答
2655 浏览

c++ - 从 std::function 调用签名推断模板参数

考虑这个模板函数:

为什么编译器不能ReturnT从传递的调用签名中推断出来?

0 投票
3 回答
2759 浏览

c++ - 默认模板参数:为什么编译器抱怨没有指定模板参数?

我有这个代码:

如果我foo()使用相同的模板“签名”作为模板函数,编译器不会抱怨没有指定模板参数:

那么为什么我需要为具有默认参数的模板类指定参数,而不是为模板函数指定参数呢?我缺少一些微妙之处吗?

原因肯定是模板参数推导失败。但我想知道为什么。