gpt4 book ai didi

c++ - 如何访问包装模板对象的函数

转载 作者:太空宇宙 更新时间:2023-11-03 10:46:50 25 4
gpt4 key购买 nike

我目前正在为现有类编写包装器。在不更改任何直接使用现有类的客户端代码的情况下编写包装器的最佳方法是什么?

class A
{
public:
void foo() {}
};

template<typename T>
class Wrapper
{
// ...other wrapper data/functionality...
private:
T myObject;
};

main()
{
Wrapper<A> wrappedA;
wrappedA.foo();
}

在 msvc 中编译失败,出现错误 C2039:“foo”:不是“Wrapper”的成员

在不更改 main 中的任何代码的情况下使模板包装类工作的最佳方法是什么?

  • 选择运算符。不能重载
  • 编写类型转换运算符以键入 T 无济于事,因为编译器不会在进行选择之前尝试转换
  • 我们可以编写一个返回内部 myObject 成员的 get 函数,但必须重写 main 中的客户端代码。如果有大量现有代码直接使用 myObject 而没有我们尝试编写的新包装类,这就不好了。

编辑

  • 我想在 myObject 上编写一个包装类,而不必更改任何直接使用 myObject 的现有客户端代码
  • A::foo() 不能被引入到包装器中,因为其他类型 T 可能没有 T::foo()

最佳答案

您需要通过A 实例调用它:

wrappedA.myObject.foo();

您的包装器不是一个非常聪明的包装器,因此您需要知道它包含一个名为 myObject 的实例。你可以通过给它一个转换运算符来让它变得聪明:

template<typename T>
class Wrapper
{
public:
T myObject;

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

这将允许您在需要 A 的地方使用它:

void bar(const A& a) { a.foo(); } // (make A::foo() a const method)

Wrapper<A> a;
bar(a); // OK

关于c++ - 如何访问包装模板对象的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19628748/

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