C++ 我可以在编译时检查std::optional函数参数是否包含值吗?
cppreference.com声明类型为C++ 我可以在编译时检查std::optional函数参数是否包含值吗?,c++,c++17,C++,C++17,cppreference.com声明类型为bool的值。这就是方法 这实际上是关于函数参数的std::optional。想象一下: class T { public: virtual void f(std::optional<int> i) {...}; }; class U : public T { public: virtual void f(std::optional<int> i) override { static_assert(
bool
的值。这就是方法
这实际上是关于函数参数的std::optional
。想象一下:
class T {
public:
virtual void f(std::optional<int> i) {...};
};
class U : public T {
public:
virtual void f(std::optional<int> i) override {
static_assert(i, "This is no longer optional");
f(i.value());
}
virtual void f(int i) {...}
};
T类{
公众:
虚空f(std::可选i){…};
};
U类:公共交通{
公众:
虚空f(标准::可选i)覆盖{
静态断言(i,“这不再是可选的”);
f(i.值());
}
虚空f(int i){…}
};
基类中可选的参数已转换为必需的参数。我很清楚,这种形式的问题源于糟糕的OO设计,但我现在不能被要求重构它。我以后会做的(我保证:D)。但是我想插入一个快速的编译器检查 我的编译器告诉我: 静态断言有一个非常量条件
为什么这被认为是非常量?首先,函数的参数,甚至是
constepr
函数的参数,从来都不是constepr
。只能通过模板参数传递constepr
值
因此,这与可选无关
其次,即使允许函数使用constepr
参数,virtual
函数也肯定不能这样做。它们依赖于动态的运行时调度,因此不可能在函数中进行编译时检查。有一个非常简单的答案:i
不是constepr
,因为i
是函数参数(这永远不是constexpr
,除非在constexpr
函数的编译时调用中,情况并非如此。提供一些更容易讨论的示例。“我假设不是。”如果你已经清楚地解释了它们为什么会起作用,那么你就没有必要去假设它们。当检查它们是否起作用是件小事时。我编辑了这个问题。我遗漏了重要的部分……很抱歉。@MartinB:现在这是一个完全不同的问题!