gpt4 book ai didi

c++ - 专门用于指针的模板类

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:42:30 26 4
gpt4 key购买 nike

我有一个模板类如下:

template <typename T>
class PacketMember
{
public:
PacketMember(const std::size_t maxMemberSize, const QString memberName) :
m_maxMemberSize(maxMemberSize),
m_memberName(memberName)
{

}

void append(const T data, const std::size_t length)
{
if(currentMemberSize() + length <= m_maxMemberSize)
{
for(std::size_t i = 0 ; i < length ; ++i) {
m_data = data;
m_member.push_back(m_data);
}
}
}

QString memberName() const
{
return m_memberName;
}

std::size_t currentMemberSize() const
{
return m_member.size();
}

std::size_t maxMemberSize() const
{
return m_maxMemberSize;
}

std::vector<T>* member() const
{
return m_member;
}

void setMaxMemberSize(const std::size_t newSize) {
m_maxMemberSize = newSize;
}

private:
T m_data;
std::vector<T> m_member;
std::size_t m_maxMemberSize;
QString m_memberName;
};

和指针的特化如下:

template <typename T>
class PacketMember<T*>
{
public:
PacketMember(const std::size_t maxMemberSize, const QString memberName) :
m_maxMemberSize(maxMemberSize),
m_memberName(memberName)
{

}

void append(T* data, const std::size_t length)
{
if(currentMemberSize() + length <= m_maxMemberSize)
{
for(std::size_t i = 0 ; i < length ; ++i) {
m_data = new T(*data);
m_member.push_back(m_data);
}
}
}

QString memberName() const
{
return m_memberName;
}

std::size_t currentMemberSize() const
{
return m_member.size();
}

std::size_t maxMemberSize() const
{
return m_maxMemberSize;
}

std::vector<T*>* member() const
{
return &m_member;
}

private:
T* m_data;
std::vector<T*> m_member;
std::size_t m_maxMemberSize;
QString m_memberName;
};

当我尝试将我的类实例化为 char*PacketMember<char*>它创建了一类 PacketMember<cha**> .为什么会这样?我应该如何避免指针对指针的实例化?对不起,如果这是一个基本问题。我对模板的经验非常有限。

编辑:

我的代码没有任何问题。这个问题只是 QtCreator 中的一个错误。我应该删除这个问题吗?请在评论中回复。谢谢。

最佳答案

是什么让你认为你得到了 PacketMember<char**> ?我看到的一个错误是你的 member()函数返回指向成员的指针,但您返回成员本身。对于您的原始问题,这证明没有“双指针”实例化:

#include <iostream>

template<typename T>
struct A {
typedef T type;
};

template<typename T>
struct A<T*> {
typedef T* pointertype;
};


static_assert(std::is_same<A<int>::type,int>::value,"Non-pointer: Not the same type");
static_assert(std::is_same<A<int*>::pointertype,int*>::value,"Pointer: Not the same type");

int main()
{
return 0;
}

(我以不同的方式命名了这两个 typedef,因此您可以看到使用了正确的特化。)

结果:编译通过。

编辑:由于您不使用 C++11,这里有一个临时技巧(可能有更好的方法)使其在没有 static_assert 的编译器上工作:

#include <iostream>

template<typename T>
struct A {
typedef T type;
};

template<typename T>
struct A<T*> {
typedef T* pointertype;
};


int main()
{
A<int>::type x = (int)0;
A<int*>::pointertype y = (int*)0;
x++;
y++;
return 0;
}

如果分配的类型不同(尝试从转换中添加/删除 *),它们将无法工作。 x++; y++;只是为了消除编译器关于未使用变量的警告。

关于c++ - 专门用于指针的模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26414654/

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