c++ - 是否可以使用 c++20 的概念来模拟多态性?

标签 c++ polymorphism c++20 c++-concepts

标题中几乎给出了这个问题。 Please considere the following godbolted code:

#include <iostream>

struct Base{};
struct Derived : Base{};

template<typename T>
concept IsDerivedFromBase = std::same_as<T, Base>;

template<typename T>
concept IsNotDerivedFromBase = not IsDerivedFromBase<T>;

template <IsDerivedFromBase T>
void foo(T bar) {std::cout << "IsBase" << std::endl;}

template <IsNotDerivedFromBase T>
void foo(T bar) {std::cout << "IsNotBase" << std::endl;}

int main()
{
    Base a;
    foo(a);

    Derived b;
    foo(b);

    Base* c = new Derived{};
    foo(*c);
    delete c;
}
上面代码的输出如下:
IsBase
IsNotBase
IsBase
我在问是否有可能以某种方式修改概念以模仿多态性。
输出应为:
IsBase
IsNotBase
IsNotBase

最佳答案

与概念相关的一切都是在编译时确定和“制定出来的”。暂时搁置 SFINAE:失败的概念要求会导致格式错误的程序和编译失败。
另一方面,C++ 中唯一可能“知道”您的 c 的部分。并没有“真正”指向 Basedynamic_cast ,在 处得到评估运行时间 .就 C++ 中的其他所有内容而言,您的 c指向 Base例如,这就是讨论的结束。
因此,总而言之,就编译时评估的所有内容而言,您的 c指向 Base没有任何其他概念可以使用,这将表明其他任何东西。

关于c++ - 是否可以使用 c++20 的概念来模拟多态性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65029749/

相关文章:

c++ - 为什么 `std::reference_wrapper` 在 c++17 中弃用并在 c++20 中删除?

c++ - 混合光的问题

c++ - 文件映射的工作原理

c++ - 指针重新分配和多态性

c++ - 多新建一删除

c++ - 有没有办法使用相同的索引遍历std::tuple和std::array?

c++ - 使用 timer_create 传递用户数据

c++ - 这是一个 mixin,可以用 C++ 完成吗?

C++:对 child 隐藏方法

c++ - 我应该在C++项目文件结构中的哪里放置用户定义的概念?