是否有可能在编译时强制两个派生类将始终为重写函数返回不同的值?

问题描述 投票:0回答:1

是否有可能在编译时强制接受以下内容,但...

class B {
public:
virtual constexpr const char* getKeyStr() const = 0;
};

class D1 : public B {
public:
constexpr const char* getKeyStr() const override { return "D1"; }
};

class D2 : public B {
public:
constexpr const char* getKeyStr() const override { return "D2"; }
};

...以下内容不是因为我们不希望D1和D2返回相同的键串吗?

class B {
public:
virtual constexpr const char* getKeyStr() const = 0;
};

class D1 : public B {
public:
constexpr const char* getKeyStr() const override { return "D1"; }
};

class D2 : public B {
public:
constexpr const char* getKeyStr() const override { return "D1"; } // can we error out here at compile time?
};
c++ polymorphism virtual constexpr c++20
1个回答
0
投票

是,您可以在编译时检查getKeyStrD1D2返回的“字符串”是否不同。

首先提供在编译时比较2 const char *的函数:

constexpr bool f(const char *x, const char *y)
{
  while(*x != '\0' )
    if (*x++ != *y++) return true;

  return *y != '\0'; 
}

然后比较返回的值:

constexpr D1 d1;
constexpr auto x = d1.getKeyStr(); 
constexpr D2 d2;
constexpr auto y = d2.getKeyStr(); 

static_assert(f(x,y));   // this will trigger, if x and y are different.

您可以将其包装起来,并使其更漂亮,但是在编译时仍然可以完成。

这里是demo

© www.soinside.com 2019 - 2024. All rights reserved.