c++ - Concepts lite是否会改变CRTP实现静态多态的需求?

标签 c++ metaprogramming crtp c++-concepts

自从几年前我发现了 CRTP 以来,我在很多地方都使用它来为非常密集的面向计算的代码实现编译时多态性。当一个人关心运行时的通用性和最大性能时,以通用方式将成员函数“注入(inject)”到类中是很棒的。

我在 concepts lite 上阅读/观看了几件事这将是(我希望)下一个 C++ 标准的一部分。以更抽象和通用的方式设计功能绝对很棒,避免了我目前使用的 SFINAE/std::enable_if 的糟糕行。

我还没有测试过实现概念的 g++ 分支来玩弄它们,并以一种新的方式研究我喜欢的元编程方法。但也许你们中的一些人有。我的第一个想法是概念不会解决静态多态性的问题,但由于这类事情可能严重依赖技巧,我可能是错的。所以我的问题如下:concepts lite 是否能够以更方便的方式实现编译时多态性(正如我们目前可以通过 CRTP 所做的那样)?(示例欢迎使用代码)。

最佳答案

我不应该这么认为。 Concepts Lite 将取代您对 enable_if 的使用,但我不确定它是否允许 CRTP 的新技术。另一方面,可能会有一些有趣的事情可以做。

我会说我在较早的概念精简版实现中遇到了一些 CRTP 问题。检查约束要求类型参数是完整类型。如果在派生类上有一个参数化的基类,则需要将检查推迟到使用点。例如:

template<Fooable D>
struct crtp {
  void f() {
    static_cast<D*>(this)->g();
  }
};

struct derived : crtp<derived> { // Error!
};

当您尝试检查 Fooable<derived> 时, derived 还没有被定义。最好这样写:

template<typename D>
struct crtp {
  void f() requires Fooable<D>() {
    static_cast<D*>(this)->g();
  }
};

现在,Fooable<D>()仅在 f() 时检查叫做。

仅供引用。

关于c++ - Concepts lite是否会改变CRTP实现静态多态的需求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19886041/

相关文章:

c++ - 如果在 C++ 中有多个继承模板,则非法调用非静态成员函数

c++ - 什么是奇怪的重复模板模式 (CRTP)?

C++ 在所有其他类中使用(通信)对象

c++ - 通过 GNU 扩展 asm 约束加载 64 位整数常量?

C++ 输出运算符重载

Groovy 扩展元类

c++ - io_service 在销毁时挂起

Ruby 嵌套发送

reflection - 什么是反射?

c++ - 奇怪的是重复出现的模板模式。没有匹配的函数用于调用..模板参数/替换失败