Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;概念和'std::是一样的吗`_C++_Templates_C++ Concepts - Fatal编程技术网

C++ C++;概念和'std::是一样的吗`

C++ C++;概念和'std::是一样的吗`,c++,templates,c++-concepts,C++,Templates,C++ Concepts,如果我试图用Key键和Element元素编写一个受概念限制为std::map和std::unordered_map的函数,它无法推断出下面代码段中的Key类型 模板 概念与=标准::是相同的::值; 模板 概念图类型= 你和我一样吗|| 与……相同; 模板 需要的映射类型 内联标准::列表映射提取键(T常量和a){ std::列表输出; 用于(自动常量和元素:a){ 输出。推回(元素。第一); } 返回输出; } std::map_示例; 自动关键点=映射提取关键点(映射示例); 它给出的实际

如果我试图用
Key
键和
Element
元素编写一个受概念限制为
std::map
std::unordered_map
的函数,它无法推断出下面代码段中的
Key
类型

模板
概念与=标准::是相同的::值;
模板
概念图类型=
你和我一样吗||
与……相同;
模板
需要的映射类型
内联标准::列表映射提取键(T常量和a){
std::列表输出;
用于(自动常量和元素:a){
输出。推回(元素。第一);
}
返回输出;
}
std::map_示例;
自动关键点=映射提取关键点(映射示例);
它给出的实际误差为:

candidate: ‘template<class T, class Key, class Element>  requires  map_type_of<T, Key, Element> std::__cxx11::list<Key> map_extract_keys(const T&)’
inline std::list<Key> map_extract_keys(T const& a) {

note:   template argument deduction/substitution failed:
note:   couldn’t deduce template parameter ‘Key’
candidate:'模板要求映射类型为std::\uuuuucxx11::列表映射提取键(const T&)'
内联标准::列表映射提取键(T常量和a){
注意:模板参数扣除/替换失败:
注意:无法推断模板参数“Key”

有什么方法可以允许自动推断吗?

你的
映射类型的
概念对一个更简单的概念没有帮助

template<typename T>
concept is_map = std::ranges::range<T> 
              && std::semiregular<typename T::key_type> 
              && std::semiregular<typename T::mapped_type>;

template <typename T>
requires is_map<T>
inline std::list<typename T::key_type> map_extract_keys(T const& a) {
    std::list<typename T::key_type> output;
    for (auto const& [key, value] : a) {
        output.push_back(key);
    }
    return output;
}
模板
概念是_map=std::ranges::range
&&std::半正则
&&std::半正则;
模板
这是一张地图
内联标准::列表映射提取键(T常量和a){
std::列表输出;
对于(自动常数和[键,值]:a){
输出。推回(键);
}
返回输出;
}

作为奖励,它允许像
boost::bimap::left_map
etc

这样的操作,只需对代码进行最小的更改,我想您可以做到:

template <template <typename, typename> class T, typename K, typename E>
requires map_type_of<T<K,E>, K, E>
inline auto map_extract_keys(T<K,E> const& a) {
    std::list<K> output;
    for (auto const& element : a) {
        output.push_back(element.first);
    }
    return output;
}
模板
需要的映射类型
内联自动映射提取键(T常量和a){
std::列表输出;
用于(自动常量和元素:a){
输出。推回(元素。第一);
}
返回输出;
}

>代码>模板内联STD::清单MaPuxExpToKyKEY(T const和A)< /C++ >您希望这段代码如何知道<代码>键> <代码> > <代码>?可悲的是C++不允许使用具体类型的结构化绑定,因此无法在<代码>中指定< <代码>循环: