gpt4 book ai didi

c++ - 从指针 typedef 创建指向 const 对象的指针

转载 作者:搜寻专家 更新时间:2023-10-31 01:38:45 25 4
gpt4 key购买 nike

设想一种情况

struct Foo{};

typedef Foo* FooPtr;

当我们只能访问 FooPtr 而不是 Foo 时(例如类定义了这样的 public typedef)

然后我们要制作const Foo 指针 的容器。不是 const 指向 Foo 对象的指针 的容器(这是被禁止的)

所以我做不到

std::vector<const FooPtr> v;    
//gives
//std::vector<Foo * const, std::allocator<Foo * const> >

C++ 为这种情况提供了什么?(我知道这是更多的设计问题,类 Foo 应该提供更好的 typedef,或者它不打算像我想要的那样使用它)

我想到的唯一解决办法是

std::vector<const std::remove_pointer<FooPtr>::type *> vv; 
//gives
//std::vector<Foo const *, std::allocator<Foo const *> >

或者写得更好(而且命名很糟糕(有什么名字建议吗?))作为特征:

template <typename T>
struct add_const_ignore_ptr
{
typedef typename const std::remove_pointer<T>::type * type;
};

像这样使用

typedef add_const_ignore_ptr<FooPtr>::type ConstFooPtr;

std::vector<ConstFooPtr> vvv;

还有更好的选择吗?

最佳答案

您可以忽略给定的 typedef,为 Foo 做一个前向声明并定义一个自己的 typedef。

struct Foo;

using MyConstFooPtr = const Foo*;

std::vector<MyConstFooPtr> myVec;

编辑:正如西蒙所说,另一种解决方案是必要的。您可以利用“decltype”来推断您需要的类型信息:

//
class Test
{
private:
struct Foo { int a; };

public:
typedef Foo* FooPtr;
};

//
template<typename T>
const T* toConst(T);

//
int main()
{
std::vector<decltype(toConst(*Test::FooPtr()))> myVec;

return 0;
}

关于c++ - 从指针 typedef 创建指向 const 对象的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32325578/

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