我有一个班级,其中有几个“类似”类型的成员,例如:
class Container {
C1 c1;
C2 c2;
C3 c3;
....
template <typename T>
const T& get() {
????
}
};
该类有一个模板化方法get<T>()
它可用于获取对类型成员的引用T
- i.e.
Container cont;
const auto& c1 = cont.get<C1>();
访问c1
成员。目前的实施get<T>()
基于对所有类型的专业化Container
班级。有没有一种优雅的方法可以实现相同的目标,而无需手动实现专业化?
您可以使用constexpr
指向数据成员的指针元组来解决您的问题std::get
。这无需更改现有实现即可实现该行为,并提供安全且简单的修改点。
#include <tuple>
struct C1 {};
struct C2 {};
class Container
{
public:
template <typename T>
const T& get()
{
constexpr auto ptr_tuple = std::make_tuple(
&Container::c1,
&Container::c2);
// T Container::* is a pointer to a data member of `Container` which has the type `T`
auto member_ptr = std::get<T Container::*>(ptr_tuple);
return this->*member_ptr;
}
private:
C1 c1;
C2 c2;
};
int main()
{
Container c;
const C1 & foo = c.get<C1>();
const C2 & bar = c.get<C2>();
}
如果您需要经常根据模板参数选择成员,您可以将元组移出get()
并使其成为constexpr static
数据成员改为:
class Container
{
public:
template <typename T>
const T& get()
{
auto member_ptr = std::get<T Container::*>(ptr_tuple);
return this->*member_ptr;
}
private:
C1 c1;
C2 c2;
static constexpr auto ptr_tuple = std::make_tuple(
&Container::c1,
&Container::c2);
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)