gpt4 book ai didi

c++ - CRTP vs 模板特化和标签调度

转载 作者:行者123 更新时间:2023-12-04 12:54:07 29 4
gpt4 key购买 nike

我试图找出 CRTP 习语与模板特化相比的优缺点。假设我想创建一个“渲染器”类,渲染器将使用“Vulkan”或“OpenGL”实现。
使用 CRTP:

template <typename T>
class Renderer
{
public:
void draw(Shape s) { static_cast<T*>(this)->drawImpl(s); };
};

class VulkanRenderer : public Renderer<VulkanRenderer>
{
public:
void drawImpl(Shape s) { /* Vulkan implementation */};
};

class OpenGLRenderer : public Renderer<OpenGLRenderer>
{
public:
void drawImpl(Shape s) { /* OpenGL implementation */ };
};
使用模板特化和类标签:
class Vulkan;
class OpenGL;

template<typename T>
class Renderer
{
public:
Renderer() { assert(false, "Type not support"); }
void draw(Shape s);
};

template<>
class Renderer<Vulkan>
{
public:
void draw(Shape s) { /* Vulkan implementation */ };
};

template<>
class Renderer<OpenGL>
{
public:
void draw(Shape s) { /* OpenGL implementation */ };
};

一种方法比另一种方法有某些优势吗?有些事情我可以用一个做而我不能用另一个做吗?静态多态性技术是否有任何替代方案?
此外,这些方法中的任何一种简单地定义单独的类(例如“VulkanRenderer”和“OpenGLRenderer”)是否有任何优势。此外,概念可能不是这两者的更好方式吗?

最佳答案

使用 CRTP,您可以将任何共享代码/类型/常量等放入基本模板,支持这两种实现。如果您没有要共享的内容,则使用 CRTP 毫无意义。它确实有一个通常易于管理的缺点,即动态创建的派生对象有通过基类指针意外或粗心删除的风险,从而导致未定义的行为。
使用 class 标签,与拥有两个不相关的类的唯一区别是更容易约束其他模板以要求某种渲染器(即 template <typename ARenderer> void f(Renderer<ARenderer>& r); ),而不是要求不相关的类,例如 std::is_same_v<T, OpenGLRenderer> || std::is_same_v<T, VulcanRenderer> - 没有多大用处。如果渲染器除了其界面的语义之外真的没有任何共同点,那么这是一个选项。

关于c++ - CRTP vs 模板特化和标签调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69057831/

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