前言:
这是一个关于在应用于覆盖继承父虚拟方法的子类时,与C++ 11一起引入的删除操作符的新含义的最佳实践的问题.
背景:
根据标准,引用的第一个用例是明确禁止某些类型的调用函数,否则转换将是隐含的,例如最新C++ 11标准草案的 §8.4.3中的示例:
struct sometype {
sometype() = delete; // OK, but redundant
some_type(std::intmax_t) = delete;
some_type(double);
};
Run Code Online (Sandbox Code Playgroud)
上面的例子清晰而有目的.但是,以下示例中,通过将新运算符定义为已删除来覆盖新运算符并阻止其被调用,这让我想到了我稍后在问题部分中确定的其他方案(下面的示例来自C++的第 8.4.3节)11标准草案):
struct sometype {
void *operator new(std::size_t) = delete;
void *operator new[](std::size_t) = delete;
};
sometype *p = new sometype; // error, deleted class operator new
sometype *q = new sometype[3]; // error, deleted class operator new[]
Run Code Online (Sandbox Code Playgroud)
题:
通过将这种思想扩展到继承,我很好奇其他人关于以下用法示例是否是明确有效的用例或者是否是对新添加的功能的滥用不清楚的想法.请为您的答案提供理由(将提供最具说服力的推理的示例).在下面的示例中,设计尝试通过使第二个版本的库继承自第一个版本来维护两个版本的库(需要实例化库).这个想法是允许错误修复或对第一个库版本所做的更改自动传播到第二个库版本,同时允许第二个库版本只关注它与第一个版本的差异.要弃用第二个库版本中的函数,delete运算符用于禁止对重写函数的调用:
class LibraryVersion1 {
public:
virtual void doSomething1() { /* does something */ }
// …Run Code Online (Sandbox Code Playgroud) 我正在寻找使用C++ 03标准的解决方案(我被限制使用这个版本的标准已有好几年了).C++ 11的解决方案也是受欢迎的,但不会被"接受"作为这个问题的答案.
什么是简单,简洁的方法,我可以将一组相关的常量浮点值表示为单一类型(类似于枚举),以确保类型安全,而不会产生显着的开销,并且仍允许我直接对值进行操作?
最终的结果是我希望能够做如下的事情:
enum FloatingPointEnum
{
VALUE1 = 0.1234f,
...
VALUEN = 0.6789f
};
float SomeFunction(FloatingPointEnum value)
{
float new_value;
/* perform some operation using "value" to calculate "new_value" */
new_value = static_cast<float>(value); // <- a simplistic example
return new_value;
}
Run Code Online (Sandbox Code Playgroud)
虽然我可以想到几个解决方案,但没有一个像我想的那样干净/简单/直接,我认为某人必须已经有一个优雅的解决方案来解决这个问题(但我似乎无法在我的搜索中找到一个).
编辑:
我希望以下对SomeFunction的调用,其值不是直接指定为枚举类型的值,无法编译:
float nonEnumeratedValue = 5.0f
SomeFunction(nonEnumeratedValue);
Run Code Online (Sandbox Code Playgroud)