gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:22:01 26 4
gpt4 key购买 nike

这段代码可以用 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/

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