- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有这个重复出现的代码块:
Class1 c1;
try {
c1.parse(x);
} catch(Exception& e) {
Class2 c2;
try {
c2.parse(x);
} catch(Exception& e) {
Class3 c3;
try {
// ...
}
// ...
}
}
显然,我感兴趣的是第一个 Class#
(#=1,2,3,...) 解析不会抛出异常的实例。
可选地,Class1
, ..., ClassN
有一个公共(public)父类(super class),我可以将它用作返回类型。
什么是简洁抽象此操作的方法,考虑到它会在代码中多次出现?
可以用STL和Boost,不能用C++11,因为项目需要:(宏是一个灰色地带。
最佳答案
没有可变参数,并且仅限于 c++03,我们被迫按照 boost 库的方式来做 - 前面有很多样板以换取稍后方便的表达:
#include <string>
#include <stdexcept>
struct Class1 { void parse(const std::string&); };
struct Class2 { void parse(const std::string&); };
struct Class3 { void parse(const std::string&); };
struct none_type {};
template<class C>
struct try_impl
{
try_impl(int index)
: _index(index)
{
}
void apply(int& which, C& c, const std::string& s) const
{
if (which >= 0)
return;
try {
c.parse(s);
which = _index;
}
catch(...) {
// logging here?
}
}
int _index;
};
template<>
struct try_impl<none_type>
{
try_impl(int index)
: _index(index)
{
}
void apply(int& which, none_type& c, const std::string& s) const
{
}
int _index;
};
// attempt to parse all given objects. Return the index of the first one that
// passed
// return -1 if non parse correctly
//
template<class C1, class C2 = none_type, class C3 = none_type, class C4 = none_type, class C5 = none_type>
struct parse_attempt_impl
{
static int apply(const std::string& s,C1 c1, C2 c2 = C2(), C3 c3 = C3(), C4 c4 = C4(), C5 c5 = C5())
{
int which = -1;
try_impl<C1>(0).apply(which, c1, s);
try_impl<C2>(1).apply(which, c2, s);
try_impl<C3>(2).apply(which, c3, s);
try_impl<C4>(3).apply(which, c4, s);
try_impl<C5>(4).apply(which, c5, s);
return which;
}
};
// you will need to make as many of these as you need
template<class C1, class C2, class C3>
int parse_attempt(const std::string& s, C1 c1, C2 c2, C3 c3)
{
return parse_attempt_impl<C1, C2, C3>::apply(s, c1, c2, c3);
}
template<class C1, class C2, class C3, class C4>
int parse_attempt(const std::string& s, C1 c1, C2 c2, C3 c3, C4 c4)
{
return parse_attempt_impl<C1, C2, C3, C4>::apply(s, c1, c2, c3, c4);
}
int main(int argc, char**argv)
{
std::string x(argv[1]);
int which = parse_attempt(x, Class1(), Class2(), Class3());
}
关于c++ - 非确定性操作的设计模式(nondet.factory?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37814866/
我使用 Deflater 编写了一个备份程序SHA-1 用于存储文件和哈希值。我看到Java的Deflater使用zlib 。如果我显式设置 Deflater 的级别,无论平台和 JRE 版本如何,我
考虑以下算法: r = 2 while r >= 1: x = -1 + 2 * random.random() y = -1 + 2 * random.random() r
我正在编写一个持久保存到磁盘的映射类。我目前只允许 str键,但如果我可以使用更多类型会很好:希望最多可以是任何可散列的(即与内置 dict 相同的要求),但更合理的是我会接受字符串、unicode、
我有一个不使用随机化的脚本,当我运行它时会给出不同的答案。我希望每次运行脚本时答案都是一样的。该问题似乎只发生在某些(病态)输入数据上。 该代码段来自一种计算线性系统特定类型 Controller 的
这对我来说不是问题,没有它我也可以生活,但我只是好奇这是否可能以及如何实现。 今天我了解到,scrapy.Request 不会按照启动的顺序完成。 伪代码示例: class SomeSpider(sc
我正在运行这个 SVD来自 scipy 的求解器,代码如下: import numpy as np from scipy.sparse.linalg import svds features = np
我正在尝试使用确定性 Miller-Rabin 算法实现素数检查功能,但结果并不总是正确的:在检查前 1,000,000 个数字时,它只找到 78,495 而不是 78,498。 这是使用 [2, 7
我正在审查各种 Android 声音 API,我想知道我应该使用哪一个。我的目标是获得低延迟的音频,或者至少是关于播放延迟的确定性行为。 我们遇到了很多问题,Android 声音 API 似乎很垃圾,
过去,我处理过对时间要求严格的软件开发。这些应用程序的开发基本上是这样进行的:“让我们编写代码,测试延迟和抖动,并优化它们,直到它们在可接受的范围内。”我觉得这非常令人沮丧。这不是我所说的 适当的工程
给定: SQL Server 表名为 TEST_TABLE TEST_TABLE 中名为 TEST_FIELD 的列 VARCHAR(50) NOT NULL 第 1 行:10YR3/6 第 2 行:
我在 64 位 Windows PC 上使用 Microsoft Visual Studio Community 2015,版本 14.xxx。 程序读取一个文本文件,其中每一行都是桥牌(四名玩家,每
我需要在 PHP 中创建一个可证明公平(确定性和种子)加密安全 (CS) 随机数生成器。我们正在运行 PHP 5,而 PHP 7 现在并不是一个真正的选择。但是,我找到了 PHP 7 的新 CS 函数
我是一名优秀的程序员,十分优秀!