在不使用额外 类 的情况下在 C++ 中实施类型安全
Enforce type safety in C++ without using extra classes
我对类型安全比较熟悉,之前在接收多个相同类型(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
就可以了。
不确定我是否正确理解了您的意思,但也许这会有所帮助:
enum SendImmediatelyPreference : bool // allows only 2 options:
{
DO_NOT_SEND_IMMEDIATELY, // false
SEND_IMMEDIATELY // true
}
如何创建一个从 std::vector 继承 (public) 的 class 以进行强类型检查。好处是只需要重写构造函数..
您还可以在 std::unordered_map> 中重新组合参数,以将参数实现为字典(如 python 或 javascript)
使用命名参数的替代方法怎么样? here. The tag approach using a tuple looks reasonable. There is also boost parameter.
中描述的 C++ 中有几种解决此问题的方法
这不提供强类型安全性,但您可能会争辩说,用户调用错误的构造函数来生成其类型安全对象的可能性与调用您的函数时使用错误标记的可能性一样。如果类型在整个应用程序中使用而不是仅为一个特定功能定义,则这种情况不太可能发生。
另请参阅用于类似目的的 boost strong typedef 与参数的讨论 here。
BOOST_STRONG_TYPEDEF
恰恰是一个强制类型安全的 typedef。
但是,this answer 提供了一些与仅将此强类型定义用于函数相关的注意事项,并认为应在整个代码中使用这些类型以防止不必要的转换。
我喜欢将参数捆绑在配置 class 或结构中。例如:
struct SendOptions
{
bool send_immediately = false;
bool divide_packet = false;
// ...
};
void sendPackage(SendOptions options);
这有额外的好处,可以在以后添加额外的选项而无需更改 sendPackage(SendOptions)
的界面。
这不会增加类型安全性但它确实有助于防止错误(特别是如果有很多参数),这可能是您想要实现的目标.
我对类型安全比较熟悉,之前在接收多个相同类型(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
就可以了。
不确定我是否正确理解了您的意思,但也许这会有所帮助:
enum SendImmediatelyPreference : bool // allows only 2 options:
{
DO_NOT_SEND_IMMEDIATELY, // false
SEND_IMMEDIATELY // true
}
如何创建一个从 std::vector 继承 (public) 的 class 以进行强类型检查。好处是只需要重写构造函数..
您还可以在 std::unordered_map> 中重新组合参数,以将参数实现为字典(如 python 或 javascript)
使用命名参数的替代方法怎么样? here. The tag approach using a tuple looks reasonable. There is also boost parameter.
中描述的 C++ 中有几种解决此问题的方法这不提供强类型安全性,但您可能会争辩说,用户调用错误的构造函数来生成其类型安全对象的可能性与调用您的函数时使用错误标记的可能性一样。如果类型在整个应用程序中使用而不是仅为一个特定功能定义,则这种情况不太可能发生。
另请参阅用于类似目的的 boost strong typedef 与参数的讨论 here。
BOOST_STRONG_TYPEDEF
恰恰是一个强制类型安全的 typedef。
但是,this answer 提供了一些与仅将此强类型定义用于函数相关的注意事项,并认为应在整个代码中使用这些类型以防止不必要的转换。
我喜欢将参数捆绑在配置 class 或结构中。例如:
struct SendOptions
{
bool send_immediately = false;
bool divide_packet = false;
// ...
};
void sendPackage(SendOptions options);
这有额外的好处,可以在以后添加额外的选项而无需更改 sendPackage(SendOptions)
的界面。
这不会增加类型安全性但它确实有助于防止错误(特别是如果有很多参数),这可能是您想要实现的目标.