gpt4 book ai didi

c++ - 编译器是如何从 map 中找出模板类型的

转载 作者:行者123 更新时间:2023-11-30 04:00:21 26 4
gpt4 key购买 nike

我是一个胆小的模板用户,通常遵循常规示例。

所以,看到下面的代码,我还是蛮惊讶的。

template<typename Table> void set(Table& tbl,
const typename Table::key_type& key,
const typename Table::mapped_type& attr)
{
typename Table::iterator iter = tbl.find(key);
if (iter != tbl.end()) {
iter->second = attr;
} else {
typedef typename Table::key_type TableKey;
typedef typename Table::mapped_type TableNonKey;
tbl.insert( std::pair<TableKey,TableNonKey>(key,attr) );
}
}

template<typename Table> void show(Table& tbl)
{
for (typename Table::iterator iter = tbl.begin();
iter != tbl.end(); ++iter) {
cout << iter->second << endl;
}
}

int main(){
std::map<int, int> table_obj;
set(table_obj, 1, 2);
show(table_obj);
}

在编译 show/set 函数时,编译器如何知道 Table 是 std::map 并能够从中扣除 Table::key_type 和 Table::mapped_type?是否还有其他类似模板的用例?

最佳答案

main 中,编译器知道“表”的类型,然后使用 Koenig Lookup/ADL在这种情况下找到合适的 set 很简单,因为只有一个。

声明

template<typename Table> void set(Table& tbl,
const typename Table::key_type& key,
const typename Table::mapped_type& attr);

实现

template<typename Table> void set(Table& tbl,
const typename Table::key_type& key,
const typename Table::mapped_type& attr) {
typename Table::iterator iter = tbl.find(key);
if (iter != tbl.end()) {
iter->second = attr;
} else {
typedef typename Table::key_type TableKey;
typedef typename Table::mapped_type TableNonKey;
tbl.insert( std::pair<TableKey,TableNonKey>(key,attr) );
}
}

key_typemapped_type 是来自 std::map 的类型定义.

如果你这样调用'set'

std::vector<int> NotAMap;
set(NotAMap, 1, 2);

循环仍然会找到“set”,并且在开始时发现 Table 可能是一个 std::vector,但是 std::vector 没有 mapped_type 所以它被拒绝为候选人。

关于c++ - 编译器是如何从 map 中找出模板类型的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26364440/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com