如果参数条件为 true,则阻止执行返回函数
Prevent a returning function from execution if a condition on parameters is true
就像标题上所说的那样,我想知道是否可以阻止函数执行。在我的特殊情况下,我正在尝试制作一个运算符[],如果参数中给出的值太高,则阻止使用器使用它:
在 .h 中:
class Vec4
{
float x,y,z,w;
public:
float operator[](const unsigned int i);
}
在.cpp:
float Vec4::operator[](const unsigned int i)
{
if(i == 0) return x;
if(i == 1) return y;
if(i == 2) return z;
if(i == 3) return w;
}
我想"破坏"函数,如果我>=4目前我只是制作控制台输出并返回 0.0f
谢谢你告诉我是否有办法...要不!
你至少可以做4件事。
- 从函数返回已知错误值。例如。
-1
输入值是否不好。 - 引发异常。
- 更改函数以通过引用传递输出并返回错误代码。
- 强制用户使用强类型
enum class
获取要点。
选项 1
float Vec4::operator[](const unsigned int i) {
switch (i)
case 0:
return x;
...
default:
return nan;
选项 2
default:
throw InvalidInputException;
选项 3
typedef ErrCode int;
const int ERROR = -1;
const int SUCCESS = 1;
...
ErrCode Vec4::getPoint(const unsigned int i, float &ouptut) {
...
switch (i)
case 0:
output = x;
return SUCCESS;
default:
return ERROR;
选项 4 (c++11)
class Vec4 {
...
public:
enum class VecMem {X, Y, Z, W};
float Vec4::getPoint(VecMem member) {
switch (member):
case X:
return x;
...
用法:
Vec4.getPoint(Vec4::VecMem::X);
使用"切换大小写",对于值差异大于 3 的情况,返回默认状态,该状态可以是为此情况保留的特定值
如果在编译过程中已知参数,则可以使用static_assert。
#include <cassert>;
constexpr float Vec4::operator[](const unsigned int i)
{
static_assert(i <= 3);
...
}
静态断言不会影响性能,因为它们在编译期间会受到检查。
如果在编译过程中不知道参数,则可以使用动态断言。
#include <cassert>;
float Vec4::operator[](const unsigned int i)
{
assert(i <= 3);
...
}
动态断言仅在设置启用它们的编译器标志后才包含在编译器输出中,因此可以轻松关闭。
或者你可以抛出一个异常。
float Vec4::operator[](const unsigned int i)
{
if (i > 3)
{
throw BadArgumentException("i must be <= 3");
}
...
}
异常可以包含大量信息,并在代码的其他部分进行处理,但性能成本最高。
http://en.cppreference.com/w/cpp/error/assert
如果您
不介意使用即将推出的功能,则可以使用std::optional
来执行此操作:
std::optional<float> Vec4::operator[](const unsigned int i) {
if(i == 0) return x;
if(i == 1) return y;
if(i == 2) return z;
if(i == 3) return w;
return {};
}
缺点是调用方必须检查返回值的有效性(使用 operator bool
或 has_value
成员函数)或使用 value_or
成员函数获取空可选项的默认值。
相关文章:
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 在 c++ 中从执行的 shell 命令获取返回状态的安全方法是什么?
- 获取上次执行的返回语句的行
- 如何在C++中执行命令并获取命令的返回代码标准输出和标准
- readAll() 或 readAllStandardOutput() 在执行之前也返回一个空字符串
- 编译器未强制执行返回协定
- 如果发生错误,则返回错误值,否则,继续执行函数
- 无法从Linux,C ++执行"my_script" python脚本"main(filename)"功能;pModule = PyImport_Import(pName);返回空值
- 从通过DLSYM执行的函数返回unique_ptr
- 如何在执行期间终止(或返回)具有结构类型的自动函数
- 有没有办法为任何函数编写通用代码,以便它可以(异步)执行并从线程池中获得返回值?
- 在返回另一个函数的函数中执行程序期间出错
- 如果参数条件为 true,则阻止执行返回函数
- 如何在 COM 中对方法执行返回类型
- 编译器是否在返回成员变量的情况下执行返回值优化
- 为什么Visual Studio在这种情况下不执行返回值优化(RVO)
- 访问可执行c++返回的值
- ADODB/C++:"执行"返回单个值时返回什么?
- sqllite CREATE INDEX执行返回错误