gpt4 book ai didi

c++ - 将函数调用转发到包装模板中的基础数据

转载 作者:行者123 更新时间:2023-12-02 10:05:35 25 4
gpt4 key购买 nike

我正在写一个模板包装器,像这样

template<class T>
class Wrapper{
public:
Wrapper(T data);
~Wrapper();

void doSomeWrapperWork();

private:
T data;
};

如果我想访问包装的数据,我显然可以添加一个 getter 函数来返回对数据的引用。但是,我想知道是否有一些模板魔术可以直接调用底层包装数据的包装函数。换句话说,如果我有一个类(class) TestObject具有公共(public)功能 void foo() ,我希望能够以这种方式调用它:
Wrapper<TestObject> myWrapper;
myWrapper.foo();

代替:
myWrapper.getData().foo();

在事先不知道这样的功能存在的情况下。这可能吗?

最佳答案

不完全是,在 C++ 得到反射之前,如果没有大量样板宏,我们将无法轻松编写包装类

但是

您可以将包装类的隐式转换添加到 T :

template<class T>
class Wrapper{
public:
Wrapper(T data_) : data(data_) {}

operator const T&() const
{
return data;
}

private:
T data;
};

现在您的类(class)可以转换为 T ,所以我们可以调用 T 上的方法,做一点工作:

用法:
struct Foo
{
constexpr int bar() const
{
return 42;
}
};

int main()
{
constexpr Foo f;
Wrapper<Foo> my_wrapper(f);
static_assert(static_cast<const Foo&>(my_wrapper).bar() == 42);
}

Demo

如果您想避免自己进行强制转换,您可以编写一个自由函数来调用您的函数,以便隐式转换可以接管:
int call_bar(const Foo& f)
{
return f.bar();
}

用法:
Foo f;
Wrapper<Foo> my_wrapper(f);
std::cout << call_bar(my_wrapper); // 42

Demo2

我有点喜欢这种方法,因为它只需要为我们想要的每个包装函数添加一个自由函数,而不必手动进行一堆强制转换。

关于c++ - 将函数调用转发到包装模板中的基础数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60307430/

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