c++ - 该模板函数能否正确匹配具有多个基数的类?

标签 c++

这段代码使用 clang 编译并运行良好,但 gcc 给出编译错误:

no matching function for call to ‘unpack(tag1, A3&)’

那么它是有效的 C++ 吗?

#include <type_traits>                                                           
#include <utility>                                                               
#include <cassert>                                                                                                                                      

template <class Tag, class Value>                                                
class Pack                                                                       
{                                                                                
 public:                                                                         
  Pack(const Value& value) : _value(value) {}                                    
  Value value() const { return _value; }                                         
private:                                                                         
  Value _value;                                                                  
};                                                                                                                                                  

template<class Tag, class Value>                                                 
decltype(auto) unpack(Tag, Pack<Tag, Value>& pack) {                             
  return pack.value();                                                           
}                                                                                

struct tag1 {};                                                                  
struct tag2 {};                                                                  

struct A3 : Pack<tag1, int>, Pack<tag2, double> {                                
  A3(int x, double y) : Pack<tag1, int>(x), Pack<tag2, double>(y) {}             
};                                                                               

int main() {                                                                     
  A3 a3(1, 2);                                                                   
  assert(unpack(tag1(), a3) == 1);                                               
  assert(unpack(tag2(), a3) == 2);                                               
}     

最佳答案

Tag位于每个函数参数的推导上下文中( TagPack<Tag, Value> & )。每个模板参数推导都是独立执行的,结果必须匹配。当试图推断Pack<Tag, Value>时来自A3 ,有两种可能的推导,因此类型推导失败。

最简单的修复可能是删除标签函数参数,而只需调用 unpack使用显式模板参数 - unpack<tag1>(a3)不比 unpack(tag1(), a3) 更详细。如果您仍然喜欢原始语法,可以编写转发器:

template<class Tag, class SomePack>
decltype(auto) unpack(Tag, SomePack& pack) { return unpack<Tag>(SomePack); }

关于c++ - 该模板函数能否正确匹配具有多个基数的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30814981/

相关文章:

C++ 异常开销和抛出指令

c++ - 获取显示器所插入的视频适配器

c++ - 比较不同大小的数组

c++ - WlanGetProfileList 不返回设备重启后创建的配置文件

c++ - 为什么scanf_s在OnlineJudge上导致编译器错误?

c++ - 如何简化这段代码?

c++ - 具有非推导上下文的部分特化排序

c++ - dll 链接静态库 - 来自未使用函数的未解析链接器符号

c++ - opencv/c++-cli 中的内存泄漏

c++ - 使用 Bazel 交叉编译时系统头文件为 "Missing dependency declarations"