- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
给定这段代码:
#include <string>
#include <vector>
#include <iostream>
template <typename T>
std::string stringify(const T&) {
return "{?}";
}
template <typename T>
std::string proxy(const T& in) {
return stringify(in);
}
// trying to specialize "stringify()"
template <typename T>
std::string stringify(const std::vector<T>& in) {
return "vector specialization!";
}
template <>
std::string stringify(const std::vector<int>& in) {
return "INT vector specialization!";
}
int main() {
std::cout << proxy(1); // calls the 1st
std::vector<int> intVec;
std::cout << proxy(intVec); // calls the 1st
std::vector<double> dblVec;
std::cout << proxy(dblVec); // calls the 1st
return 0;
}
我怎样才能专攻stringify()
对于 vector<>
在 proxy<>
之后?
目前我得到 {?}{?}{?}
如果我删除这个 - stringify(const std::vector<T>& in)
然后是 vector<int>
开始被调用,因为它将是第一个的特化。
然后我会得到 {?}INT vector specialization!{?}
有什么方法可以调用 proxy()
中的 2 个 vector 特化字符串化函数中的任何一个? - 如果它们是最后定义的 - 在 proxy()
之后功能?
有没有办法部分专注于 vector<>
仍然接到来自 proxy<>
的电话?
我不想专注于 vector<int>
, vector<double>
, vector<UserType>
...
编辑: 忘了说我需要这个 C++98
最佳答案
首先,避免专门化函数模板,更喜欢重载。参见 Herb Sutter's article关于潜在的陷阱。
其次,您遇到的问题涉及名称查找如何对函数模板中的相关名称进行工作。里面proxy<T>
, stringify
是从属名称 - 它取决于 T
.该名称将在模板的定义点(将找到 stringify<T>(const T&)
而不是其他重载)和在参数的关联命名空间中的实例化点再次查找(这将是 std
)。这些查找都没有找到您的其他功能。
我们可以利用查找的第二部分——参数相关查找。让我们将所有内容都放在一个命名空间中(我将其命名为 N
是任意的,您可以根据需要随意重命名):
namespace N {
struct helper { };
template <typename T>
std::string stringify(helper, const T&) {
return "{?}";
}
}
template <typename T>
std::string proxy(const T& in) {
return stringify(N::helper(), in);
}
好的,到目前为止我们没有做任何改变。我们仍然得到 {?}
在所有情况下。但是现在我们可以进一步重载(而不是特化)stringify
仍在该 namespace 中,但在 proxy
的定义之后:
namespace N {
template <typename T>
std::string stringify(helper, const std::vector<T>& ) {
return "vector overload!";
}
std::string stringify(helper, const std::vector<int>& ) {
return "INT vector overload!";
}
}
这两个重载将在名称查找的第二阶段找到,因为 N
是 helper
的关联命名空间.现在proxy(intVFec)
将找到 stringify
的所有三个重载而不仅仅是一个。现在你的代码打印:
{?}INT vector overload!vector overload!
随心所欲。以上都不需要 C++11。
关于c++ - 模板重载解决问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36948242/
一、前言: Python如何使用OS模块调用cmd 在os模块中提供了两种调用 cmd 的方法,os.popen() 和 os.system() os.system(cmd) 是在执行command命
我对双链表进行了简化。我的双链表是一个以头和尾为节点的结构。 有一个函数可以创建列表并返回它。在同一函数中,我执行尾节点和头节点之间的链接。问题是,当我返回列表(因此转到函数之外)时,所有链接都消失了
我有这个信息。 let params2: [String: AnyObject] = [ "app_token": myapptoken, "member_access_token":
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 7 年前。 Improve
我正在尝试发出解析为特定 IP 的 cURL 请求。从我读过的所有内容来看,这在我看来在语法上是正确的,但我仍然看到“无法解决主机错误”。有人能指出我正确的方向吗?我看到了各种错误: curl —-r
我正在尝试使用 curl 在 jira 服务器中获取数据。我试过这个命令 curl -u username:password -X GET -H "Content-Type: applicat
因此,下面的代码有时会起作用,有时它会添加&符号(到复制缓冲区),我试图从文本字符串中删除它。 代码的要点是将字符串从正确位置复制到与号之前。但是,在随机情况下,它仍然会添加 & 符号。 Privat
p = Int('p') q = Int('q') s = Solver() s.add(1<=p<=9, 1<=q<=19, 5<(3*p-4*q)<10) s.check() print s.mo
我在这里阅读了分配问题的解决方案:http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=hungarianAlgorithm 我了解 O(n
控制台中显示警告: the id param was not provided. 文档提到将使用当前路由: current is the current Route by default (most
我正在尝试使用hector-core作为grails Maven构建中的依赖项。 me.prettyprint hector-core 1.0-3 bundle 我收到一个错误 [
我正在尝试使用 JavaScript 变得更好,并且我在破坏页面方面做得非常好:))))) 我正在尝试使用 Firebug 进行调试,但一开始有点困惑。它的哪个选项卡用于调试 JavaScript?我
我正在使用最新的 Angular + Firebase 并尝试设置登录授权系统。我有包含登录+注册链接的 home.html,转到 login.html 并添加凭据工作正常(提交时记录正确的 UID)
我有一个 iPad 应用,现在需要将其转换为通用应用。我已将目标设置为 Universal,现在它也可以部署到 iPhone,但是,我有一个主要问题:即使我已经创建了我的 main分别查看两种设备类型
我在 CSS 中使用媒体查询来根据 IE11 和 Chrome 的屏幕分辨率缩放我的网页。当我运行 this webpage在我的 2 个不同屏幕上的 chrome(顺便说一句,我用它来确定我的最小宽
我正在解决nodeschool练习“Juggling Async”,我是这样解决的 var http=require("http"); var urls=process.argv.slice(2,pr
我试图相对神秘地要求一个文件,发生了以下情况 这很好,它指向 /Users/marcos/Desktop/Taper/lib/utils.js myPath = "/Users/marcos/Desk
我正在尝试解决一个项目,但遇到了问题。 • 您的程序应该显示一个菜单,允许用户执行以下操作以下操作(注:使用GUI): 添加新客户 删除客户 修改客户信息//此选项必须显示子菜单: --------1
我需要 x 图标来删除输入字段值1. 当用户键入任何内容时,将显示“x”图标 如果输入框中没有可用的值,x 将被隐藏 当输入框中的值可用并且焦点移出输入框时,我们需要隐藏 x 图标并聚焦,我们需要再次
我正在使用 ajs(1.4.7) 和 angular-ui-router(0.2.15) 开发一个简单的 AJS 应用程序。 经历了this文章并选择了路由解析技术。 这是我遇到的错误 错误:[$in
我是一名优秀的程序员,十分优秀!