gpt4 book ai didi

c++ - 有没有办法在 C++ 中使用模板函数来做到这一点

转载 作者:行者123 更新时间:2023-11-30 00:53:10 25 4
gpt4 key购买 nike

我目前正在编写一些代码以将 Java 代码转换为 C++ 代码,结果遇到了一些棘手的问题。我的问题是,是否可以使用重载运算符从包含类返回模板值?

即:我希望能够使用以下类(class)执行以下操作。

SmartPointer<ArrayClass<bool>*> boolArray = new ArrayClass<bool>(true, true, false, false);
bool b = boolArray[1];


template <typename T> class SmartPointer
{
T data;

template <typename U>
U operator [](int i) const
{
return ((*T)(*data))[index];
}
}

template ArrayClass<U>
{
// Various constructors...

U operator [](int i) const
{
// Implementation here
}
}

我遇到的问题(可以理解)是: 错误 C2783:“U SmartPointer::operator const”:无法推断“U”的模板参数编译器不知道 U 是什么,我希望能够告诉它它是 bool 值——因为这是 ArrayClass 将要返回的值。 SmartPointer 可能不包含数组,在这种情况下 [] 运算符就没有意义。但是我希望能够将它传递给智能指针内的对象,以防它...?

我不知道该怎么做才能完成这项工作。也许这是不可能的??

回答:

感谢大家的回复。提供了 3 个基本相同的解决方案,但我将此授予 Oktalist,因为他是第一个。不过,我仍然对这个解决方案有困难,因为我将指针传递到我的 SmartPointer 类中以允许我使用前向声明的类。这阻止了我使用 T::value_type 作为我的返回类型,但这似乎是正确的方法。看起来我向编译器提出了很多要求,看起来我将不得不恢复到简单地取消引用智能指针以便进行数组访问!

最佳答案

传统的 C++03 方法是使用 typedef,通常命名为 value_type。在 C++11 中,我们可以使用 autodecltype 对此进行改进。这是您修改为同时使用两者的示例:

SmartPointerCPP03<ArrayClass<bool>> boolArray = new ArrayClass<bool>(true, true, false, false);
SmartPointerCPP11<ArrayClass<bool>> boolArray = new ArrayClass<bool>(true, true, false, false);
bool b = boolArray[1];

template <typename T> class SmartPointerCPP03
{
T* data;

typename T::value_type operator [](int i) const
{
return (*data)[i];
}
}

template <typename T> class SmartPointerCPP11
{
T* data;

auto operator [](int i) const -> decltype(std::declval<T>()[i])
{
return (*data)[i];
}
}

template <typename T> class SmartPointerCPP14
{
T* data;

auto operator [](int i) const
{
return (*data)[i];
}
}

template <typename U> ArrayClass
{
// Various constructors...

typedef U value_type;

U operator [](int i) const
{
// Implementation here
}
}

我还冒昧地将 T data 更改为 T* data 并从实例化的参数中删除了 * 。顺便说一句,你的 (T*) 转换是错误的,我也删除了它。

关于c++ - 有没有办法在 C++ 中使用模板函数来做到这一点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17203849/

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