在.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
谢谢你告诉我是否有办法......或者没有!
答案 0 :(得分:7)
你至少可以做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);
答案 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");
}
...
}
例外可以包含大量信息,并在代码的其他部分处理,但性能成本最高。
答案 2 :(得分:0)
使用“switch case”,对于大于3的différent值,返回默认状态,该状态可以是为此情况保留的特定值
答案 3 :(得分:0)
如果您不介意使用即将推出的功能,可以使用std::optional
来执行此操作:
operator bool
缺点是调用者必须检查返回值的有效性(使用has_value
或value_or
成员函数)或使用private bool isSelected;
public bool IsSelected
{
get { return isSelected; }
set
{
if (value && !isSelected)
{
isSelected = value;
RaisePropertyChanged("IsSelected");
}
}
}
成员函数获取默认值空选项的值。