【发布时间】:2010-07-05 19:32:04
【问题描述】:
假设我正在编写一个 API,我的一个函数采用一个表示通道的参数,并且只会在值 0 和 15 之间。我可以这样写:
void Func(unsigned char channel)
{
if(channel < 0 || channel > 15)
{ // throw some exception }
// do something
}
或者我是否利用 C++ 作为一种强类型语言,让自己成为一种类型:
class CChannel
{
public:
CChannel(unsigned char value) : m_Value(value)
{
if(channel < 0 || channel > 15)
{ // throw some exception }
}
operator unsigned char() { return m_Value; }
private:
unsigned char m_Value;
}
我的功能现在变成了:
void Func(const CChannel &channel)
{
// No input checking required
// do something
}
但这完全是矫枉过正吗?我喜欢自我记录和保证它是它所说的那样,但是值得为这样一个对象的构造和破坏付出代价,更不用说所有额外的打字了吗?请让我知道您的 cmets 和替代方案。
【问题讨论】:
-
FWIW,由于参数类型是
unsigned,所以没有测试channel < 0的目的。 -
随机有趣的事实:Ada 本身就支持这一点,如
type CChannel is range 0..15;,几年前有一个 paper 关于向 C 添加类似的功能 -
@Michael: ...Ada 从 Pascal 那里得到它,它只是稍微改变了语法 (
type CChannel = 0 .. 15;)。 -
既然您已经回答了您提出的问题,您是否考虑过是否真的应该拥有一个
class Channel和一个成员Channel::Func()? -
为什么要让
Func成为会员?这既不是 Java 也不是 C#!
标签: c++ api types strong-typing