在不使用额外类的情况下,在C ++中实现类型安全

时间:2017-03-29 10:49:16

标签: c++ c++11 boost type-safety

我对类型安全有点熟悉,并且在接收相同类型(bool)的几个参数的方法之前已成功使用它以避免混淆。例如:

// Old version of the method
void sendPackage(bool sendImmediately, bool dividePacket);

// Type safe version
enum SendImmediatelyPreference
{
    SEND_IMMEDIATELY,
    DO_NOT_SEND_IMMEDIATELY
};

enum PacketDivisionPreference
{
    DIVIDE_PACKET,
    DO_NOT_DIVIDE_PACKET
};

void sendPackage(
    SendImmediateltPreference immediatePref,
    PacketDivisionPreference divisionPref);

因此神秘的sendPackage(true, false)变为sendPackage(SEND_IMMEDIATELY, DO_NOT_DIVIDE_PACKET)

问题是这只是bool的一个选项。我有一个接受多个std::vector<std::string>的方法,我想尽量减少用户以错误的顺序输入参数的可能性。

我可以考虑创建包含std::vector<std::string>的不同类,并覆盖大量的std::vector方法或公开内部向量。

有一种更简单的方法,某种类型的typedef可以强制实现类型安全吗?使用boost就行了。

5 个答案:

答案 0 :(得分:2)

使用命名参数的替代方法怎么样?在C ++中描述here有几种方法可以解决这个问题。使用元组的标记方法看起来很合理。还有boost parameter

这不提供强大的类型安全性,但您可能会争辩说,用户调用错误的构造函数来制作类型安全对象的可能性与调用函数时使用错误的标记一样。如果在整个应用程序中使用类型而不是仅为一个特定函数定义类型,则不太可能发生这种情况。

另请参阅针对类似目的here的boost strong typedef vs参数的讨论。

答案 1 :(得分:0)

我不确定我是否理解正确,但也许这有助于:

enum SendImmediatelyPreference : bool  // allows only 2 options:
{
  DO_NOT_SEND_IMMEDIATELY,  // false
  SEND_IMMEDIATELY          // true
}

答案 2 :(得分:0)

如何创建一个从std :: vector继承(public)以获得强大的类型检查的类。优点是你只需要重写构造函数..

您还可以在std :: unordered_map&gt;中重新组合参数,以将参数实现为dict(如在python或javascript中)

答案 3 :(得分:0)

BOOST_STRONG_TYPEDEF正是一个强制类型安全的typedef。

但是,this answer提供了一些与仅使用函数强类型定义相关的警告,并认为应该在整个代码中使用这些类型以防止不必要的转换。

答案 4 :(得分:0)

我喜欢在config类或struct中捆绑参数。例如:

struct SendOptions
{
    bool send_immediately = false;
    bool divide_packet = false;
    // ...
};

void sendPackage(SendOptions options);

这具有额外的优势,可以在以后添加额外选项,而无需更改sendPackage(SendOptions)的界面。