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

0 投票
2 回答
2193 浏览

c++ - 转发声明使用 enable_if 的函数:模糊调用

我在声明一个使用的函数时遇到了一些麻烦boost::enable_if:以下代码给了我一个编译器错误:

编译时,我收到“对 foo 的模糊调用”错误。根据 的定义enable_if,'type' typedef 对应于void条件为真时,所以据我所知,foo匹配的两个签名。为什么编译器认为它们不同,是否有正确的转发声明方法foo(最好不重复该enable_if部分)?

0 投票
2 回答
833 浏览

c++ - 如何为具有特定类型特征的所有类型编写函数模板?

考虑以下示例:

该类Scanner用于从某个来源中提取标记。上面的代码工作正常,但当我尝试使用get其他整数类型(如 achar或 an )时失败unsigned int。读取这些类型的代码与读取int. 我可以为我想阅读的所有其他整数类型复制代码,但我宁愿为所有整数类型定义一个函数模板。

我尝试了以下方法:

这就像一个魅力,但我不确定如何Scanner::get<string>()再次发挥作用。那么,我该如何编写代码,以便我可以做scanner.get<string>()并且scanner.get<any integral type>()有一个定义来读取所有整数类型呢?

更新:奖金问题:如果我想根据某些特征接受多个类别的课程怎么办?例如:如果我想要三个 get函数分别接受(i)整数类型(ii)浮点类型(iii)字符串,我应该如何解决这个问题。

0 投票
4 回答
5441 浏览

c++ - enable_if 和转换运算符?

有机会使用enable_if类型转换运算符吗?看起来很棘手,因为返回类型和参数列表都是隐式的。

0 投票
1 回答
9071 浏览

c++ - C++0x 中的 disable_if 在哪里?

Boost 同时具有enable_ifdisable_if,但 C++0x 似乎缺少后者。为什么它被遗漏了?disable_ifC++0x中是否有元编程工具允许我构建enable_if


哦,我刚刚注意到std::enable_if基本上是,并且在 C++0x 中boost::enable_if_c没有这样的东西。boost::enable_if

0 投票
1 回答
627 浏览

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:

我希望有人对此有解释。

0 投票
2 回答
2479 浏览

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......但我仍然对编译器为什么会窒息感兴趣。

0 投票
3 回答
2698 浏览

c++ - C++ boost enable_if 问题

我有什么方法可以简化以下陈述吗?(可能,使用boost::enable_if

我有一个简单的类结构 -Base基类Derived1Derived2继承自Base.

我有以下代码:

我想使用translator_between.

我希望能够编写的示例(伪代码):

boost::enable_if有什么方法可以使用and来实现这一点boost::is_base_of

0 投票
1 回答
1062 浏览

c++ - 为什么这个模板函数不能推导出类型?

如果我指定 read<int>,它会起作用。有没有办法让它从参数中推断出类型?

0 投票
3 回答
3091 浏览

c++ - Boost enable_if 问题

这或多或少是从 boost docs 粘贴的副本,我不断收到错误(实际上有很多错误)

我试图确保模板类仅与使用 boost 的数字一起使用。这是一个 boost 练习,而不是制作一个只使用数字的模板类。

前几个错误 C2143:语法错误:缺少 ';' 在“<”之前:第 9 行 C2059:语法错误:“<”:第 9 行 C2899:类型名不能在模板声明之外使用

顺便说一句,Visual Studio 2005。

0 投票
6 回答
1138 浏览

c++ - 松耦合隐式转换

当类型在语义上等价时,隐式转换非常有用。例如,假设两个库实现了相同的类型,但在不同的命名空间中。或者只是一种几乎相同的类型,除了一些语义糖在这里和那里。现在,您不能将一种类型传递给旨在使用另一种类型的函数(在其中一个库中),除非该函数是模板。如果不是,您必须以某种方式将一种类型转换为另一种类型。这应该是微不足道的(否则类型毕竟不是那么相同!)但是显式调用转换会使您的代码膨胀,其中大部分是无意义的函数调用。虽然这样的转换函数实际上可能会复制一些值,但从高级“程序员”的角度来看,它们基本上什么都不做。

隐式转换构造函数和运算符显然会有所帮助,但它们会引入耦合,因此其中一种类型必须了解另一种类型。通常,至少在处理库时,情况并非如此,因为其中一种类型的存在使另一种变得多余。此外,您不能总是更改库。

现在我看到了两个关于如何在用户代码中进行隐式转换的选项:

  1. 第一个是提供一个代理类型,它为所有涉及的类型实现转换运算符和转换构造函数(和分配),并始终使用它。

  2. 第二个需要对库进行最小的更改,但具有很大的灵活性:为每个涉及的类型添加一个转换构造函数,可以选择在外部启用。

例如,为一个类型A添加一个构造函数:

和一个模板

默认情况下禁用隐式转换。

然后要启用两种类型之间的转换,请专门化模板:

并实现一个convert可以通过ADL找到的功能。

我个人更喜欢使用第二种变体,除非有强烈的反对意见。

现在到实际问题:为隐式转换关联类型的首选方法是什么?我的建议是好主意吗?这两种方法都有缺点吗?允许这样的转换危险吗?当他们的类型很可能在他们最有可能使用的软件中被复制时,库实现者一般是否应该提供第二种方法(我在这里考虑 3d 渲染中间件,其中大多数包都实现了 3D向量)。