- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我找到了很多关于模板推导的信息(例如 C++ templated function overloading rules ),但它并不能帮助我理解重载递归函数的模板推导行为。在下面的代码中,我不太明白编译器是如何推断出它应该使用 vector<T>
的。 vectvect
函数两次和 pair<T,U>
两次 pairpair
- 但它可以。因此,我不明白为什么它不能推断出它应该同时使用 vector<T>
和 pair<T,U>
vectpair
的函数?
这与为什么 const
有关吗?关键字导致增加转换,从而使 T
功能更好? (但是在这种情况下,其他两个示例如何工作?)
这两个第一次推导是否可能只是因为当前函数在递归调用中首先测试模板推导?
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
template<class T> string print(const T& t){
ostringstream s;
s << t;
return s.str();
}
template<class T> string print(const vector<T>& t){
ostringstream s;
s << '[';
for(int i=0;i<(int)t.size();i++)
s << print(t[i]) << ' ';
s << ']';
return s.str();
}
template<class T,class U> string print(const pair<T,U>& t){
ostringstream s;
s << '(' << print(t.first) << ',' << print(t.second) << ')';
return s.str();
}
int main ( int argc, char **argv ) {
vector<vector<double> > vectvect(4,vector<double>(4));
for(int i=0;i<(int)4;i++)
for(int j=0;j<(int)4;j++)
vectvect[i][j] = i*4+j;
pair<int,pair<string,double> > pairpair = make_pair(10, make_pair("foo",0.5));
vector<pair<int,string> > vectpair(1,make_pair(42,"bar"));
///template deduction
cout << print(vectvect) << endl;
cout << print(pairpair) << endl;
///template deduction failure
//====> here is the problem
//cout << print(vectpair) << endl;
return 0;
}
目前,我只是想了解,但如果有人知道如何在不引入大量源开销的情况下做到这一点,我很感兴趣。
谢谢。
最佳答案
问题与模板参数推导无关,也与重载解析无关。 print
重载采用一对未被编译器选择,因为它无法通过非限定名称查找找到,ADL 也无法找到。你应该重新排序你的函数的两个定义,以便第一个接受一对的定义:
template <class T,class U> string print(const pair<T,U>& t){
/**/
}
template <class T> string print(const vector<T>& t){
/**/
}
或者在定义和使用它们之前声明所有函数:
template <class T> string print(const T& t);
template <class T,class U> string print(const pair<T,U>& t);
template <class T> string print(const vector<T>& t);
关于c++ - c++中重载递归函数的模板推导规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32874397/
运行以下代码片段,我没有收到任何错误,并且得到了预期的结果。但是,由于第二个模板实例化是不明确的 ( both type specifiers are references ),我担心这可能不是定义的
考虑以下示例: #include struct A {}; template void f() { static_assert(std::is_same_v); // #1 A&
从 DH 协商中派生的 secret 派生出一个比方说 128 位 AES key 的正确(可接受的)方法是什么? 使用前 128 位 对 secret 进行哈希处理并使用前 128 位 使用一些更复
从 DH 协商中派生的 secret 派生出一个比方说 128 位 AES key 的正确(可接受的)方法是什么? 使用前 128 位 对 secret 进行哈希处理并使用前 128 位 使用一些更复
我对编写模板元编程比较陌生,这可能是我找不到解决这个问题的原因。问题是这样的:我正在开发一个数学库,它有很多函数,比如确定整数或 std::initializer_list 的质数,将整数更改为罗马数
我在 Android Oreo 源代码中阅读了一些我不太理解的代码。 首先,类IOMXNode有一个函数: class IOMXNode : public IInterface { public: +
有很多关于模板参数推导的讨论和澄清,特别是引用折叠和“通用引用”。本题通过相关细节:How does auto deduce type? ,而 Scott Meyers 的这篇论文更详细,可能会提供更
我将 Java 中的许多假设带到了我对 C++ 的学习中,这似乎再次难倒了我。我没有足够的词汇量来 Eloquent 地说出我希望从以下程序中看到什么,所以我只展示它并说出我希望看到的内容: #inc
对于下面的程序,Clang 5 (trunk) 报告 IsNoexcept 不可推导,而 GCC 7.1 会出现段错误。 标准(草案)对此有何评论?这是编译器 QOI 问题吗? static_asse
我最近发现,在 lambda 中按值捕获 const 对象意味着 labmda 主体(即 lambda 的数据成员)内的变量也是 const. 例如: const int x = 0; auto fo
我是否有机会推断出 PHP Closure 参数类型信息?考虑这个例子: 5, 'b' => 10]); } else { call_user_func($closure, 5, 10);
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
对于上述 svm 的拉格朗日函数,我可以得到如下的偏导数: 但是,我不明白如何将它们插入拉格朗日以导出对偶形式? W可以被替换,但是b去哪里了? 有人可以解释一下并给出详细步骤吗? 最佳答案 你的拉格
我正在寻找一些算法、程序或函数来推断变量的创建方式,只要我提供其他变量即可。我认为计算机程序员会称之为“反编译”,而架构师会称之为“逆向工程”,但我想我不知道统计学家会怎么调用它......或者是否有
这就是我的简单类的样子。 template class A { T first; T second; public: A(T f, T s) : first(f), second(s) {}; te
这个问题在这里已经有了答案: Is it possible to figure out the parameter type and return type of a lambda? (5 个答案)
我有一个函数需要两个 std::function s 作为参数。第二个函数的参数与第一个函数的结果类型相同。 我写了一个这样的函数模板: template void examplFunction(st
O'reilly Optimizing SQL Statments Book的Explaining MySQL Explain章节,最后有这个问题。 The following is an examp
举例 template void function(T&& arg) 有人可以详细解释它是如何结束函数签名变成左值的 T& 和传入的右值的 T&& 吗?我知道不知何故(需要标准行)T -> T& 在
我正在开发用于 EMV 交易的软件,但我面临着雇佣我的公司的文档严重缺乏的问题。 其中之一是关于用于生成 ARQC 的 MKD(在第一个 GENERATE AC 期间)。我从消息请求中知道IAD如下:
我是一名优秀的程序员,十分优秀!