gpt4 book ai didi

c++ - 按类型检索可变参数类的给定成员

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

这是一个递归类定义:

template<class... T>
class Mgr2
{

};

template<class T, class... args>
class Mgr2<T, args...>
{
Container<T> _container;
Mgr2<args...> _tail;
public:
Mgr2() { };
};

我想实现以下内容:

Mgr2<int, double> mgr;
mgr.get<int>(); // retrieves the Container<int> element

我该怎么做?我尝试做几件事但失败了....一个自由函数也很好,而且我不在乎如果类定义中有 2 个“int”时行为是否未定义

谢谢!

最佳答案

下面是通过重组 Mgr2 来实现此目的的一种草图:

template<class T>
struct Leaf {
Container<T> container;
};

template<class... Ts>
struct Mgr2 : Leaf<Ts>... {
template<class T>
Container<T> &get() {
return static_cast<Leaf<T>&>(*this).container;
}
};

Mgr2 实例化后,重复类型会导致编译时错误。


如果我们想要允许重复,或者除了按类型索引之外还允许按整数索引,我们可以向 Leaf 添加一个索引参数:

template<std::size_t I, class T>
struct Leaf {
Container<T> container;
};

并调整Mgr2:

template<class Seq, class...> struct Mgr2_Impl;

template<std::size_t... Is, class... Ts>
struct Mgr2_Impl<std::index_sequence<Is...>, Ts...>
: Leaf<Is, Ts>... { };

template<class... Ts>
struct Mgr2 : Mgr2_Impl<std::index_sequence_for<Ts...>, Ts...> {
private:
template<class T, std::size_t I>
Leaf<I, T>& do_get(Leaf<I, T>& leaf) { return leaf; }
template<std::size_t I, class T>
Leaf<I, T>& do_get(Leaf<I, T>& leaf) { return leaf; }

public:
template<class T>
decltype(auto) get() { return do_get<T>(*this).container; }
template<std::size_t I>
decltype(auto) get() { return do_get<I>(*this).container; }
};

如果您想保留您的原始设计,您可以使用 SFINAE 或标签调度。显示前者:

template<class U>
std::enable_if_t<std::is_same<U, T>{}, Container<U>&> get(){
return _container;
}
template<class U>
std::enable_if_t<!std::is_same<U, T>{}, Container<U>&> get(){
return _tail.template get<U>();
}

关于c++ - 按类型检索可变参数类的给定成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32429954/

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