假设我有一堂课,其中包含一些数学运算。让我们用一个玩具例子
class Test
{
public:
Test( float f ) : mFloat( f ), mIsInt( false ) {}
float mFloat;
int mInt;
bool mIsFloat;
};
我想使用以下原型创建一个运算符重载:
float operator=( const Test& test )
{
if ( !test.mIsFloat ) return *this; // in this case don't actually do the assignment
return test.mFloat; // in this case do it.
}
所以我的问题是:我可以用内置的返回类型重载 operator= 吗?如果是这样,有没有办法引用内置类型?
我知道如果我用一个类包装内置插件我可以做到这一点。但在这种情况下,我想让赋值运算符与 LHS 上的内置类型一起使用
使用示例:
Test t( 0.5f );
float f = t; // f == 0.5
int i = 0;
i = t; // i stays 0.
更新:非常感谢您的帮助。从玩具示例中扩展一点,以便人们了解我真正想要做的事情。
我有一个配置系统,允许我从具有不同类型的参数树中获取配置参数(它们可以是整数、浮点数、字符串、数组等)。
我可以通过以下操作从树中获取项目:
float updateTime = config["system.updateTime"];
但是“system.updateTime”可能不存在。或者是错误的类型。通常对于配置,我有一个默认值块,然后代码覆盖配置中的默认值:
float updateTime = 10;
const char* logFile = "tmp.log";
... etc etc...
我想做类似的事情:
updateTime = config["system.updateTime"];
如果有覆盖,则操作成功。因此,如果 operator[] 的返回值是树中的“无效”节点,通常不会发生赋值。
现在我用如下函数解决它:
getConfig( config, "system.updateTime", updateTime );
但我更喜欢使用赋值运算符。
如果我愿意创建类来包装内置函数,我可以这样做。
class MyFloat
{
operator=( const Test& test ) { if (test.isValidNode() ) f = test.float(); return *this; }
float f;
}
但显然最好不要仅仅为了重载分配而用普通类包装内置函数。问题是 - 这在 C++ 中可能吗?