gpt4 book ai didi

c++ - 具有 get 函数的模板类总是返回引用,

转载 作者:行者123 更新时间:2023-11-30 01:24:50 24 4
gpt4 key购买 nike

这里怎么可能有一个模板化类叫做

FrontBackBuffer 带有模板参数 TBackBufferType, TFrontBufferType

template< typename TBufferTypeFront, typename TBufferTypeBack = TBufferTypeFront>
class FrontBackBuffer{
public:
explicit FrontBackBuffer(
TBufferTypeFront const & m_front,
TBufferTypeBack const & m_back):
m_Front(m_front),
m_Back(m_back)
{
};

~FrontBackBuffer()
{};

typename std::remove_reference<
typename std::remove_pointer<TBufferTypeFront>::type
>::type & getFront(){return m_Front;} // error: invalid initialization of reference of type 'A&' from expression of type 'A*'| (here T is A)


typename std::remove_reference<
typename std::remove_pointer<TBufferTypeBack>::type
>::type & getBack(){return m_Back;}

TBufferTypeFront m_Front; ///< The front buffer
TBufferTypeBack m_Back; ///< The back buffer

};

我想实现以下目标:

  • 为了在代码中保持一致,无论缓冲区中的类型是什么,我都希望有一个函数getFront/Back,它应该始终返回对缓冲区(const 或非常量取决于类型:例如 const int = T 应该返回一个 const int 和引用!我想写这样的代码

    FrontBuffer<const int&, std::vector<int> > a;
    a.getFront() = 4 //COmpile error! OK!;
    a.getBack()[0] = 4;
    FrontBuffer< int*, GAGAType * > b;
    b.getBack() = GAGAType();
    b.getFront() = int(4); // this is no ERROR, i would like to get the reference of the memory location pointet by int* ....

我喜欢这个,因为如果我将缓冲区类型从引用更改为指针(我需要取消引用),我想避免更改语法

  • 这样的 Buffer 类是否可以接受所有可能的类型(如 shared_ptr)asd

  • 我想要的只是一些访问权限,它应该非常高效,没有拷贝等等

  • 我真的不知道如何编写这个通用缓冲区?有人有什么线索吗?

谢谢!!!

EDIT1 我还希望能够分配给解除引用的指针:

b.getFront() = int(4);  // this is no ERROR, i would like to get the reference of the memory location pointet by int* ....

这就是我的特质问题所在!

最佳答案

您需要专门化 (traits technique) 模板的一部分,如下所示:

template <typename T>
struct MyRefTypes {
typedef const T & Con;
typedef T& Ref;
typedef const T& CRef;
static Ref getRef(T& v) {
return v;
}
};

更新
请注意用于返回引用的特殊函数 - 如果你想对指针表现不同,则需要它 - 返回它的引用。
结束更新

并对引用和常量引用进行特化:

template <typename T>
struct MyRefTypes {
typedef const T & Con;
typedef T& Ref;
typedef const T& CRef;
static Ref getRef(T& v) {
return v;
}
};

//Specialization for Reference
template <typename T>
struct MyRefTypes<T&> {
typedef T & Con;
typedef T& Ref;
typedef const T& CRef;
static inline Ref getRef(T& v) {
return v;
}
};

//Specialization for const Reference
template <typename T>
struct MyRefTypes<const T&> {
typedef const T & Con;
typedef const T& Ref;
typedef const T& CRef;
static inline Ref getRef(const T& v) {
return v;
}
};

//Specialization for const
template <typename T>
struct MyRefTypes<const T> {
typedef const T & Con;
typedef const T& Ref;
typedef const T& CRef;
static inline Ref getRef(const T& v) {
return v;
}
};

更新
指针的这种“特殊”特化 - 因此它们将用作引用:

//Specialization for pointers
template <typename T>
struct MyRefTypes<T*> {
typedef T* Con;
typedef T& Ref;
typedef T* const CRef; //! note this is a pointer....
static inline Ref getRef(T* v) {
return *v;
}
};

//Specialization for const pointers
template <typename T>
struct MyRefTypes<const T*> {
typedef const T* Con;
typedef const T& Ref;
typedef const T* const CRef; //! note this is a pointer....
static inline Ref getRef(const T* v) {
return *v;
}
};

((但是我不确定这种针对指针的专门化是不是一个好的设计...))


结束更新

以及类模板中的用法:

template< typename TBufferTypeFront, typename TBufferTypeBack = TBufferTypeFront>
class FrontBackBuffer{
public:


typedef typename MyRefTypes<TBufferTypeFront>::Ref TBufferTypeFrontRef;
typedef typename MyRefTypes<TBufferTypeFront>::CRef TBufferTypeFrontCRef;
typedef typename MyRefTypes<TBufferTypeFront>::Con TBufferTypeFrontCon;

typedef typename MyRefTypes<TBufferTypeBack >::Ref TBufferTypeBackRef;
typedef typename MyRefTypes<TBufferTypeBack >::CRef TBufferTypeBackCRef;
typedef typename MyRefTypes<TBufferTypeBack >::Con TBufferTypeBackCon;

explicit FrontBackBuffer(
TBufferTypeFrontCon m_front,
TBufferTypeBackCon m_back):
m_Front(m_front),
m_Back(m_back)
{
};

~FrontBackBuffer()
{};
// See here special functions from traits are used:
TBufferTypeFrontRef getFront(){return MyRefTypes<TBufferTypeFront>::getRef(m_Front); }
TBufferTypeBackRef getBack(){return MyRefTypes<TBufferTypeBack>::getRef(m_Back); }

TBufferTypeFront m_Front; ///< The front buffer
TBufferTypeBack m_Back; ///< The back buffer

};

它按预期工作: http://ideone.com/e7xfoN

关于c++ - 具有 get 函数的模板类总是返回引用,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13292359/

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