gpt4 book ai didi

c++ - 如何根据参数化类型的特定成员的类型对模板类函数进行不同的实现

转载 作者:行者123 更新时间:2023-11-30 03:31:06 26 4
gpt4 key购买 nike

所以这是简化的问题,假设我们有两种类型

struct Shape2D
{
Vec2 Position;
};

struct Shape3D
{
Vec3 Position;
};

我要创建一个模板类测试

template<class T>
class Test
{
public:
int method1()
{
//return 1 if member T::Position is Vec2,
//return 2 if member T::Position is Vec3
}
}

使得下面的代码有效

Test<A> ta;
Test<B> tb;
assert(ta.method1() == 1);
assert(tb.method1() == 2);

这个问题的真正背景是 OpenGL 引擎。我希望能够对 2D 和 3D 顶点数据使用相同的序列化类,而不必编写 3D 和 2D 版本。

最佳答案

有几种方法可以解决这个问题。

最简单的方法就是使用正常的重载决议:

template<class T>
class Test
{
private:
T myT;

int internal(Vec2)
{
return 1;
}

int internal(Vec3)
{
return 2;
}
public:
Test() : myT{} {}

int method1()
{
return internal(myT.Position);
}
};

这需要您实际拥有 T 的实例。如果不这样做,那么您将需要使用基于模板的方法。这是一个相当深的主题,但是在您的示例中可以执行您想要的操作的一种方法是:

template <typename T>
int internal();

template <>
int internal<Vec2>()
{
return 1;
}

template <>
int internal<Vec3>()
{
return 2;
}

template<class T>
class Test
{
public:
int method1()
{
return internal<decltype(T::Position)>();
}
};

关于c++ - 如何根据参数化类型的特定成员的类型对模板类函数进行不同的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44469153/

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