gpt4 book ai didi

c++ - 使用 Boost.Program_options 的输入流运算符查找顺序

转载 作者:行者123 更新时间:2023-11-28 00:20:58 28 4
gpt4 key购买 nike

我在命名空间 fw::example 中有一个枚举类和一个相应的输入流运算符.

#include <stdexcept>
#include <string>
#include <istream>

namespace fw {
namespace example {

enum class Booleans {
kFalse = 0,
kTrue = 1
};

std::istream& operator>>(std::istream& is, Booleans& boolean) {
std::string token;
is >> token;

if ("true" == token) {
boolean = Booleans::kTrue;
} else if ("false" == token) {
boolean = Booleans::kFalse;
} else {
throw std::invalid_argument{
"Invalid string representation for an enumerator of the Booleans class."};
}

return is;
}

} // namespace example
} // namespace fw

然后我通过 Boost.Program_options 绑定(bind)该枚举的一个变量在同一个命名空间中:

// [...]
description_.add_options()(
"bool",
boost::program_options::value<Booleans>(&boolean_)
->required()
->default_value(Booleans::kFalse),
"A boolean string, either true or false.");
// [...]

但我不想公开 std::runtime_error给用户,相反我想要使用框架中的适当异常,即 boost::program_options::invalid_option_value .想象一个更复杂的场景,其中枚举类和输入流运算符是在一个库中定义的,而我无法修改该库。

所以我尝试了以下(根据我在 SO 上找到的答案,但我找不到了):

namespace boost {
namespace program_options {

std::istream& operator>>(std::istream& is,
fw::example::Booleans& boolean) {
try {
return fw::example::operator>>(is, boolean);
} catch (std::invalid_argument const& kException) {
throw invalid_option_value{kException.what()};
}
}

} // namespace program_options
} // namespace boost

整个代码都可以编译,但问题是,只有自由函数 fw::example::operator>>被调用,因此传播了错误的执行:

terminate called after throwing an instance of 'std::invalid_argument'
what(): Invalid string representation for an enumerator of the Booleans class.

我正在寻找一种能够清楚地分离 Boost.Program_options 的解决方案其余的相关代码,但也使用适当的异常。

我正在使用以下环境:

  • Boost v1.49
  • GCC v4.71 与 -std=c++11争论。

最佳答案

问题似乎是您正在(滥用)使用流媒体运营商进行验证。

相反,提供一个 Custom Validator 进行验证。

在那种情况下,您不再与运算符<<的行为发生冲突。


program_options 命名空间中添加竞争重载时,您所能期望的最好结果是编译器会发现该重载/too/可接受,因此无法使用“模棱两可”进行编译过载”

关于c++ - 使用 Boost.Program_options 的输入流运算符查找顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27526817/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com