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

时间:2017-01-07 21:53:13

标签: c++

像标题上所说的那样,我想知道是否有可能阻止执行某个功能。在我的特殊情况下,我试图创建一个operator []并阻止utilisator使用它,如果参数中的值太高:

在.h:

class Vec4
{
    float x,y,z,w;

    public:

        float operator[](const unsigned int i);
}

in .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;
}

如果i> = 4,我想“破解”这个功能 目前我只是制作一个控制台输出并返回0.0f

谢谢你告诉我是否有办法......或者没有!

4 个答案:

答案 0 :(得分:7)

你至少可以做4件事。

  1. 从函数返回已知错误值。例如。如果输入值不好,则-1
  2. 提出异常。
  3. 更改函数以通过引用传递输出并返回错误代码。
  4. 强制用户使用强类型enum class获取该点。
  5. 选项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); 
    

答案 1 :(得分:0)

如果您的参数在编译期间已知,则可以使用 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

答案 2 :(得分:0)

使用“switch case”,对于大于3的différent值,返回默认状态,该状态可以是为此情况保留的特定值

答案 3 :(得分:0)

如果您不介意使用即将推出的功能,可以使用std::optional来执行此操作:

operator bool

缺点是调用者必须检查返回值的有效性(使用has_valuevalue_or成员函数)或使用private bool isSelected; public bool IsSelected { get { return isSelected; } set { if (value && !isSelected) { isSelected = value; RaisePropertyChanged("IsSelected"); } } } 成员函数获取默认值选项的值。