是否有可能在编译时强制接受以下内容,但...
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?
};
是,您可以在编译时检查getKeyStr
的D1
和D2
返回的“字符串”是否不同。
首先提供在编译时比较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。