如果参数条件为 true,则阻止执行返回函数

Prevent a returning function from execution if a condition on parameters is true

本文关键字:执行 返回 函数 参数 条件 true 如果      更新时间:2023-10-16

就像标题上所说的那样,我想知道是否可以阻止函数执行。在我的特殊情况下,我正在尝试制作一个运算符[],如果参数中给出的值太高,则阻止使用器使用它:

在 .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. 从函数返回已知错误值。例如。 -1输入值是否不好。
  2. 引发异常。
  3. 更改函数以通过引用传递输出并返回错误代码。
  4. 强制用户使用强类型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 boolhas_value 成员函数)或使用 value_or 成员函数获取可选项的默认值。