问题标签 [enable-if]
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++ - 转发声明使用 enable_if 的函数:模糊调用
我在声明一个使用的函数时遇到了一些麻烦boost::enable_if
:以下代码给了我一个编译器错误:
编译时,我收到“对 foo 的模糊调用”错误。根据 的定义enable_if
,'type' typedef 对应于void
条件为真时,所以据我所知,foo
匹配的两个签名。为什么编译器认为它们不同,是否有正确的转发声明方法foo
(最好不重复该enable_if
部分)?
c++ - 如何为具有特定类型特征的所有类型编写函数模板?
考虑以下示例:
该类Scanner
用于从某个来源中提取标记。上面的代码工作正常,但当我尝试使用get
其他整数类型(如 achar
或 an )时失败unsigned int
。读取这些类型的代码与读取int
. 我可以为我想阅读的所有其他整数类型复制代码,但我宁愿为所有整数类型定义一个函数模板。
我尝试了以下方法:
这就像一个魅力,但我不确定如何Scanner::get<string>()
再次发挥作用。那么,我该如何编写代码,以便我可以做scanner.get<string>()
并且scanner.get<any integral type>()
有一个定义来读取所有整数类型呢?
更新:奖金问题:如果我想根据某些特征接受多个类别的课程怎么办?例如:如果我想要三个 get
函数分别接受(i)整数类型(ii)浮点类型(iii)字符串,我应该如何解决这个问题。
c++ - enable_if 和转换运算符?
有机会使用enable_if
类型转换运算符吗?看起来很棘手,因为返回类型和参数列表都是隐式的。
c++ - C++0x 中的 disable_if 在哪里?
Boost 同时具有enable_if
和disable_if
,但 C++0x 似乎缺少后者。为什么它被遗漏了?disable_if
C++0x中是否有元编程工具允许我构建enable_if
?
哦,我刚刚注意到std::enable_if
基本上是,并且在 C++0x 中boost::enable_if_c
没有这样的东西。boost::enable_if
c++ - 使用嵌套类的奇怪 enable_if 行为(MSVC 编译器错误或功能?)
在调试了我的代码一段时间后,我使用 enable_if 将问题的原因归结为一些意想不到的模板专业化结果:
以下代码在 Visual Studio 2010(和 2008)中的 DoTest() 中的断言失败,而在 g++ 3.4.5 中则没有。但是,当我从SomeClass中删除模板或将my_condition移出SomeClass的范围时,它也可以在 MSVC 中使用。
这段代码是否有问题可以解释这种行为(至少部分),或者这是 MSVC 编译器中的错误?
(使用此示例代码对于 boost 和 c++0x stl 版本是相同的)
当试图通过将条件移出范围来修复它时,我还注意到在使用 std::enable_if 时这还不够,但至少它适用于 boost::enable_if:
我希望有人对此有解释。
c++ - enable_if + disable_if 组合引发模棱两可的调用
在尝试回答这个问题时,我想建议使用enable_if
+disable_if
来允许基于类型是(或不是)多态的事实重载方法。
所以我创建了一个小测试文件:
这似乎很温顺。
然而 gcc (3.4 ...) 对此感到窒息:
test.cpp:在函数中
int main(int, char**)
:
test.cpp:29:错误:重载的调用address_of(N*)
不明确
test.cpp:17:注意:候选者是:void* address_of(T*, boost::enable_if<boost::is_polymorphic<T>, void>*)
[with T = N]
test.cpp:20:注意:void* address_of(T*, boost::disable_if<boost::is_polymorphic<T>, void>*)
[with T = N ]
在我看来,这里应该使用哪种重载似乎相当清楚。我的意思是很明显我已经定义了一个替代方法,一次只能使用一个函数......我原以为 SFINAE 会处理使不必要的重载无效。
...
我通过使用(ellipsis) 而不是并需要一个虚拟的第二个参数来修补它disable_if
......但我仍然对编译器为什么会窒息感兴趣。
c++ - C++ boost enable_if 问题
我有什么方法可以简化以下陈述吗?(可能,使用boost::enable_if
)。
我有一个简单的类结构 -Base
基类Derived1
,Derived2
继承自Base
.
我有以下代码:
我想使用translator_between
.
我希望能够编写的示例(伪代码):
boost::enable_if
有什么方法可以使用and来实现这一点boost::is_base_of
?
c++ - 为什么这个模板函数不能推导出类型?
如果我指定 read<int>,它会起作用。有没有办法让它从参数中推断出类型?
c++ - Boost enable_if 问题
这或多或少是从 boost docs 粘贴的副本,我不断收到错误(实际上有很多错误)
我试图确保模板类仅与使用 boost 的数字一起使用。这是一个 boost 练习,而不是制作一个只使用数字的模板类。
前几个错误 C2143:语法错误:缺少 ';' 在“<”之前:第 9 行 C2059:语法错误:“<”:第 9 行 C2899:类型名不能在模板声明之外使用
顺便说一句,Visual Studio 2005。
c++ - 松耦合隐式转换
当类型在语义上等价时,隐式转换非常有用。例如,假设两个库实现了相同的类型,但在不同的命名空间中。或者只是一种几乎相同的类型,除了一些语义糖在这里和那里。现在,您不能将一种类型传递给旨在使用另一种类型的函数(在其中一个库中),除非该函数是模板。如果不是,您必须以某种方式将一种类型转换为另一种类型。这应该是微不足道的(否则类型毕竟不是那么相同!)但是显式调用转换会使您的代码膨胀,其中大部分是无意义的函数调用。虽然这样的转换函数实际上可能会复制一些值,但从高级“程序员”的角度来看,它们基本上什么都不做。
隐式转换构造函数和运算符显然会有所帮助,但它们会引入耦合,因此其中一种类型必须了解另一种类型。通常,至少在处理库时,情况并非如此,因为其中一种类型的存在使另一种变得多余。此外,您不能总是更改库。
现在我看到了两个关于如何在用户代码中进行隐式转换的选项:
第一个是提供一个代理类型,它为所有涉及的类型实现转换运算符和转换构造函数(和分配),并始终使用它。
第二个需要对库进行最小的更改,但具有很大的灵活性:为每个涉及的类型添加一个转换构造函数,可以选择在外部启用。
例如,为一个类型A
添加一个构造函数:
和一个模板
默认情况下禁用隐式转换。
然后要启用两种类型之间的转换,请专门化模板:
并实现一个convert
可以通过ADL找到的功能。
我个人更喜欢使用第二种变体,除非有强烈的反对意见。
现在到实际问题:为隐式转换关联类型的首选方法是什么?我的建议是好主意吗?这两种方法都有缺点吗?允许这样的转换危险吗?当他们的类型很可能在他们最有可能使用的软件中被复制时,库实现者一般是否应该提供第二种方法(我在这里考虑 3d 渲染中间件,其中大多数包都实现了 3D向量)。