gpt4 book ai didi

c++ - 为什么我的 get() 函数不能接收元组的子类?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:06:29 24 4
gpt4 key购买 nike

我在网上复制了一个元组实现,大多数情况下它都能找到:

template<class... Ts>
class tuple {};

template<class T, class... Ts>
class tuple<T, Ts...> : public tuple<Ts...> {
public:
tuple(T t, Ts... ts) : tuple<Ts...>(ts...), tail(t) {}
T tail;
};

template<size_t, class>
struct elem_type_holder;

template<class T, class... Ts>
struct elem_type_holder<0, tuple<T, Ts...>> {
typedef T type;
};

template<size_t k, class T, class... Ts>
struct elem_type_holder<k, tuple<T, Ts...>> {
typedef typename elem_type_holder<k - 1, tuple<Ts...>>::type type;
};

template<size_t k, class... Ts>
typename std::enable_if<
k == 0, typename elem_type_holder<0, tuple<Ts...>>::type &>::type
get(tuple<Ts...> &t) {
return t.tail;
}

template<size_t k, class T, class... Ts>
typename std::enable_if<
k != 0, typename elem_type_holder<k, tuple<T, Ts...>>::type &>::type
get(tuple<T, Ts...> &t) {
tuple<Ts...> &base = t;
return get<k - 1>(base);
}

比如我写的代码是这样的:

tuple<int, int, int> mytuple(1, 2, 3);
std::cout << get<1>(mytuple) << std::endl;

将打印“2”。

但是我发现如果我创建一个子类来继承我的自定义元组:

class Foo : public tuple<int, int, int> {
public:
Foo() : tuple<int, int, int>(1, 2, 3) {}
};

并在 main() 中为 Foo 创建一个对象:

Foo foo;
td::cout << get<1>(foo) << std::endl;

get() 函数将不起作用,错误是:

no matching function for call to ‘get<1>(Foo&)’

然后我测试 std::tuplestd::get()std::tuple 的子类与 std::get()

目前我必须将它静态转换到元组类而不是传递它,这很烦人。

那我错过了什么?我怎样才能像 STL 一样传递我的 tuple 的子类?

最佳答案

g++告诉我们:

<source>:30:6: note:   template argument deduction/substitution failed:
<source>:39:15: note: 'tuple<T, Ts ...>' is an ambiguous base class of 'Foo'
39 | get<1>(foo);
| ^

这是由以下的递归继承性质引起的:

template <class T, class... Ts>
struct tuple<T, Ts...> : tuple<Ts...> { };

因为编译器不知道要推导什么基类。它可以是 tuple<int> 中的任何一个, tuple<int, int> , 或 tuple<int, int, int> .

事实上,将定义更改为...

template <class T, class... Ts>
struct tuple<T, Ts...> { };

...将使演绎工作。


一个可能的解决方法是将元组重新定义为:

template <class T, class... Ts>
struct tuple<T, Ts...>
{
tuple<Ts...> parent;
};

live example on godbolt.org

关于c++ - 为什么我的 get<k>() 函数不能接收元组的子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57109290/

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