问题标签 [explicit-specialization]

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 投票
1 回答
14799 浏览

c++ - 源文件中成员函数模板的显式特化

我有一个带有成员模板函数的类:

在 Writer 的源文件中,我为以下内容添加了明确的特化some_type

这工作......有时。即使我确定我有正确的类型:

有时会调用显式特化,有时会调用主特化。是什么赋予了?

0 投票
1 回答
1211 浏览

c++ - 如何在 C++ 中对称地实现序列化和反序列化模板函数

我想编写一系列模板函数来序列化和反序列化对象。我已经完成了序列化部分,一切正常:

serialize.h可以序列化各种组合,例如unordered_map<string, vector<int>>.

现在不知道如何递归实现反序列化函数来支持任意组合。

以下是我deserialize.h的不起作用:

rapidjson是一个 C++ JSON 库,https://github.com/miloyip/rapidjson

然后,如果我尝试反序列化 JSON 字符串:

它会抛出编译错误:

似乎没有办法像序列化那样简单地实现反序列化功能。

有任何想法吗?

0 投票
1 回答
57 浏览

haskell - 在 Haskell 中指定术语来自何处的上下文

这是一个虚拟示例:

哈斯克尔然后说

错误来自 Haskell 无法推断类型变量的事实,解决方案是从 typeclass 的定义中b0删除参数。但是,实际上,我做不到。bTest

我的问题是:是否存在一种明确识别行中给出的b0显式参数的方法?bf :: Test a b => a

谢谢。

0 投票
1 回答
881 浏览

c++ - 重载运算符'<<'的显式特化(左移)

假设我有一个类,我想为它重载一个基于枚举类型的运算符:

这在 g++ 和 clang++ 上都构建干净(忽略它确实做了一些漂亮的转储的事实)。

如果我想以同样的方式重载 '<<' 运算符怎么办?类似的方法似乎不起作用:

根据 g++,从 main 到 operator 的调用是无效的:

另一方面,clang++ 会产生不同的错误消息:

它继续列出标准库中可能的“<<”重载(如果我理解正确的话),例如:

到底是怎么回事?这种运营商专业化是否可能/允许?如果是这样,呼叫操作员的正确方法是什么?还是clang正确并且定义不正确?

0 投票
2 回答
959 浏览

c++ - 为什么在不专门化类的情况下不允许显式专门化成员?

C++ 标准规定如下:

在类模板的成员或出现在命名空间范围内的成员模板的显式特化声明中,成员模板和它的一些封闭类模板可能保持未特化,除非声明不应显式特化类成员模板,如果它封闭类模板也没有明确专门化。(自 C++11 以来的 14.7.3/16 和旧标准中的 14.7.3/18)

这意味着以下情况是不可能的:

已经有多个问题与此相关,这些问题或多或少都被“标准这么说”回答了。我真的不明白为什么存在这个限制。

0 投票
1 回答
96 浏览

c++ - 函数模板c ++的显式特化

这是函数模板,不知何故,main在调用函数时,即使参数为validate,它也从不使用第二个函数( for ) 。谁能看到我的问题在哪里?const char&char

0 投票
1 回答
1009 浏览

c++ - 模板方法的模板模板参数推导失败(尽管明确专门)

我正在尝试编写一个可通过 c++ 扩展的小型脚本解释器。为此目的,函数处理程序被插入到调度表中。为了简化我的问题,handlertype 定义如下(在实际代码中,它包含参数列表和返回类型的参数):

就目前而言,调度表是一个简单的无序映射,具有(某种)错位的名称作为实现重载的关键:

方法可以直接添加到这个表中,例如一个简单的方法,它需要两个类型的参数intoperator+ii在我的例子中是这个的管理名称):

然而,许多处理程序,尤其是那些与基本数学相关的处理程序,确实接受各种参数,所有组合intdouble都是有效的,产生 4 个方法和 4 个调度表条目。因此我决定使用模板来实现这些方法。举个例子,这可能基本上是这样的(再次简单化):

然后调度表填充如下:

仍然有很多要输入的内容,但现在还可以。无论如何,由于模板参数和方法签名(损坏的名称)之间显然存在相关性,因此我尝试将其自动化,您可以编写(参数名称损坏将在 handler_provider::add 内完成):

然后它将在开始时获取参数并将它们作为第二种类型的模板参数(这样就不必输入<int, int>两次)。

只是为了澄清; 我知道我会my_add_handler像这样明确专门化模板:

但我想省略的正是这种重复(扭曲<int,int>)。

但是,我不断收到最后一部分的错误。该handler_provider::add方法定义如下(上面提到的参数名称mangeling被省略了,因为它不是这里的重点并且按预期工作):

如上所述,第一个重载是针对我上面描述的确切情况假设的,下面的处理程序安装非模板函数和完全专用的函数。

但是,这给了我一个错误,说明无法推断出来自如上所示调用的内部模板。我不认为我告诉编译器推导出任何东西,我在调用中完成了专门的模板参数(再次):

外部可变参数模板的参数class... Ts显式命名<int, int>,内部模板模板的简单参数命名为my_add_handler. 但是,编译器似乎忽略了这个(?)。这是我得到的输出(gcc 5.4.0 using -std=c++14):

我得到第二个错误,这完全没问题,应该不是问题,因为这个重载应该被踢出模板类型的重载解析。第一个错误是让我发疯的错误。

Clang (3.9.0) 更精确一点:

但我仍然不明白我在这里错在哪里。我错过了什么?

谢谢,

塞巴斯蒂安


为了更好的测试,这里是一个完整的例子:

0 投票
1 回答
627 浏览

generics - swift:如何编写调用专用函数的通用函数

描述我想要的最好方法是通过这个例子:

如何编写此代码,以便我可以使用lerpKeyframes(...)forCGFloat和?CGPointCGRect

0 投票
1 回答
1774 浏览

c++ - 声明不能解决“实例化后的显式特化”错误

假设我正在尝试使用Curiously Recurring Template Pattern创建自己的 boost::filesystem::path 实现:

(为简洁起见,代码不完整,但在使用 ' ' 编译时会出现问题g++ -std=c++11 -o mypath ./mypath.cpp,使用 GCC 4.8.4)

mypath.hpp:

我的路径.cpp:

当然,我发现编写的代码不会编译,因为我在隐式实例化它Separators()之后明确地专门化了它。IsSeparator()但我并不是特别想玩打地鼠的游戏,试图让我所有的方法都井井有条。

在研究关于 SO 的类似问题时,我发现其中一个接受的答案表明我可以通过仅仅声明我的专业来巧妙地解决这个问题。但...

  1. 我在 mypath.cpp 中注释掉的template class PathBase<Path>;行对问题没有影响,并且
  2. 感觉就像我的头文件已经用它的整个class Path : public PathBase<Path> { ... }声明声明了显式特化。

我的显式声明到底需要是什么样的?

0 投票
1 回答
781 浏览

c++ - 如何从另一个命名空间中显式地专门化一个函数模板?

出于可读性的原因,我想将一个函数模板专门化为接近在命名空间内声明的类的定义:

但是,使用上面的代码,我从 clang++ 4.0 得到以下错误:

这似乎是一个命名空间问题。我怎样才能使上述工作(不将模板函数专业化移出Nested命名空间)?

编辑:我也尝试过添加::my_function专业: