gpt4 book ai didi

基于 C++ 模板的 get()

转载 作者:行者123 更新时间:2023-12-02 02:24:18 32 4
gpt4 key购买 nike

我有一个类(class),其中有几个“类似”类型的成员,例如:

class Container {

C1 c1;
C2 c2;
C3 c3;
....

template <typename T>
const T& get() {
????
}
};

该类有一个模板化方法 get<T>()它可用于获取对 T 类型的成员的引用- 即

Container cont;

const auto& c1 = cont.get<C1>();

访问c1成员。目前执行get<T>()基于 Container 中表示的所有类型的特化类(class)。有没有一种优雅的方法可以实现相同的目标,而无需手动实现特化?

最佳答案

您可以使用指向数据成员的指针的 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);
};

关于基于 C++ 模板的 get(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65939204/

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