gpt4 book ai didi

c++ - 为什么模板参数推导不起作用?

转载 作者:太空狗 更新时间:2023-10-29 19:57:39 24 4
gpt4 key购买 nike

以下玩具程序将一种音乐类型转换为相应的颜色。它编译和执行得很好——COUNTRY 的转换正如预期的那样失败了,conversion()函数返回默认值 WHITE .但是,如果我删除模板参数,<MUSIC, COLOR> , 模板参数推导不识别使用什么类型。我怎样才能得到工作的扣除?

#include <map>
#include <iostream>
#include "boost/assign.hpp"

template<typename Key, typename T>
T convert(const Key &k, const T &d, const std::map<Key, T> &m) {
typename std::map<Key, T>::const_iterator it = m.find(k);
return it == m.end() ? d : it->second;
}

enum MUSIC { ROCK, RAP, EDM, COUNTRY };
enum COLOR { RED, BLUE, ORANGE, WHITE };

int main()
{
COLOR c = convert<MUSIC, COLOR>(COUNTRY, WHITE,
boost::assign::map_list_of (RAP, RED) (EDM, BLUE) (ROCK, RED));
std::cout << c << std::endl;
}

最佳答案

boost::assign::map_list_of可能不是 map<K,V> 类型,而是某种可转换为它的类型。

编译器试图从前 2 个参数和最后 1 个参数中推断出类型。最后一个 1 没有意义,所以它放弃了。

我们可以按如下方式阻止对最后一个参数的推导:

template<class T>struct tag{using type=T;};
template<class Tag>using type_t=typename Tag::type;

template<class T>using block_deduction=type_t<tag<T>>;

template<typename Key, typename T>
T convert(const Key &k, const T &d, const block_deduction<std::map<Key, T>> &m) {
typename std::map<Key, T>::const_iterator it = m.find(k);
return it == m.end() ? d : it->second;
}

鲍勃应该是你的叔叔。

在 C++03 中:

template<class T>struct no_deduction{typedef T type;};

template<typename Key, typename T>
T convert(const Key &k, const T &d, const typename no_deduction<std::map<Key, T>>::type &m) {
typename std::map<Key, T>::const_iterator it = m.find(k);
return it == m.end() ? d : it->second;
}

这在逻辑上是等价的,但更丑陋。

关于c++ - 为什么模板参数推导不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31462478/

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