小编int*_*lfx的帖子

逐渐构建一个对象

假设有两个类的层次结构(class Derived: public Base).这两个类都有很大的内存占用和昂贵的构造函数.请注意,这些类中没有任何内容在堆中分配:它们只是有一个大的sizeof.

然后有一个具有快速路径(始终执行)和慢速路径(有条件地执行)的功能.快速路径需要一个Base实例,慢速路径需要一个Derived从现有基础构建的实例.此外,只有在快速路径之后才能做出慢速路径决定.

当前代码如下所示:

void f()
{
    Base base;
    /* fast path */

    if (need_slow_path) {
        Derived derived (base);
        /* slow path */
    }
}
Run Code Online (Sandbox Code Playgroud)

这是低效的,因为需要将基数复制到派生中; 基数也被分配两次,存在堆栈溢出的风险.我想要的是:

  • Derived例如,分配内存
  • 打电话Base给它
  • 执行快速路径
  • 如果需要,Derived在现有Base实例上调用ctor 并执行慢速路径

在C++中有可能吗?如果没有,有哪些可行的解决方法?显然,我正在努力优化速度.

c++

21
推荐指数
3
解决办法
1310
查看次数

带有解析/匹配示例的C++ BNF语法

我正在开发一个C++解析器(用于IDE),所以现在尝试详细了解C++语法.虽然我在http://www.nongnu.org/hcb/找到了一个优秀的语法源,但我很难理解它的某些部分 - 特别是,哪些"真正的"语言结构对应于各种制作.

所以我正在寻找一个C/C++ BNF语法指南,其中包含与各种制作/规则相匹配的代码示例.有吗?

c++ grammar parsing bnf

7
推荐指数
1
解决办法
5294
查看次数

STL关联容器:擦除和取回(不可复制的)元素

我正在使用STL关联容器(std::setstd::map)与持有std::unique_ptr<>实例的键.关键定义等同于以下内容:

struct Key
{
    std::unique_ptr<Object> object;
    bool operator== (const Key& rhs) const { return object->equal (*rhs.object); }
    bool operator<  (const Key& rhs) const { return object->less (*rhs.object); }
}
Run Code Online (Sandbox Code Playgroud)

众所周知,STL关联容器(特别是自C++ 11以来)没有办法获得对要移动的键的非const引用.我的密钥是不可复制的,所以c ++:从容器中删除元素并将其取回不起作用.

是否有非UB方法来克服这个问题?

我目前的解决方案如下:

template <typename T>
using map_pair_type = std::pair<typename T::key_type, typename T::mapped_type>;

template <typename T>
typename T::value_type take_set (T& container, typename T::iterator iterator)
{
    typename T::value_type result = std::move (const_cast<typename T::value_type&> (*iterator));
    container.erase (iterator);
    return result;
}

template <typename T> …
Run Code Online (Sandbox Code Playgroud)

c++ templates stl c++11

5
推荐指数
1
解决办法
247
查看次数

sed-ish oneliner 在替换中执行算术

我有一个 form 字符串FOO_123_BAR.bazquux,其中FOOBAR是固定字符串,123是一个数字并且bazquux是自由格式的文本。

我需要对这个字符串执行文本转换:提取123bazquux,增加数字,然后将它们排列在不同的字符串中。
例如,FOO_123_BAR.bazquux? FOO=124 BAR=bazquux. (实际转换更复杂。)

自然地,我可以在一系列 sed 和 expr 调用中做到这一点,但它很难看:

shopt -s lastpipe

in=FOO_123_BAR.bazquux
echo "$in" | sed -r 's|^FOO_([0-9]+)_BAR\.(.+)$|\1 \2|' | read number text
out="FOO=$((number + 1)) BAR=$text"
Run Code Online (Sandbox Code Playgroud)

是否有更强大的文本处理工具可以在一次调用中完成这项工作?如果是,那么如何?


编辑:我很抱歉没有更清楚地说明这一点,但输入和输出的确切结构是一个例子。因此,我更喜欢使用任何分隔符或不存在分隔符的通用解决方案,而不是依赖于例如存在下划线的解决方案。

bash awk sed

5
推荐指数
2
解决办法
117
查看次数

关于std :: list赋值的libstdc ++中的错误?

在使用libxml ++(libxml2的C++包装器)时,我最近遇到了一个非常有趣的不一致.

该库使用默认STL列表容器(std::list<xmlpp::Node*>)返回节点列表.因为它是从默认存储库安装的,所以它似乎是在C++ 03模式下构建的(但我正在使用C++ 11).

这里需要注意的是C++ 11改变了方式std::list::size().
在C++ 03中,它是O(n),std::distance(begin(), end())每次调用- 现在它返回预先计算的值.

这是代码:

  /**  Returns the number of elements in the %list.  */
  size_type
  size() const _GLIBCXX_NOEXCEPT
  {
#ifdef __GXX_EXPERIMENTAL_CXX0X__
    return this->_M_impl._M_size;
#else
    return std::distance(begin(), end());
#endif
  }
Run Code Online (Sandbox Code Playgroud)

当我从图书馆收到这样的清单并打电话时,情况就开始发生size()了.在那里我读取了像140734320138496这样的值,它清楚地表明了一个未初始化的计数器:在原始列表中完全没有计数器.当然,
手动呼叫std::distance (list.begin(), list.end())确实有效.

问题是 - 这可以被认为是GCC/libstdc ++中的一个错误,或者我永远不应该链接不同GCC模式中构建的可执行文件?

c++ gcc list std c++11

3
推荐指数
1
解决办法
193
查看次数

如何将嵌套 Python 枚举的成员导出到包含的类中?

我有一个包含字段的 Python 类state。为了定义所有可能的状态,我声明了一个嵌套枚举:

class Foo:
    class State(enum.Enum):
        Unloaded = enum.auto()
        Loaded = enum.auto()
        Processed = enum.auto()

    state: State
Run Code Online (Sandbox Code Playgroud)

不过这样写代码有点麻烦:

if foo.state == Foo.State.Unloaded:
    do_something_with(foo)
    foo.state = Foo.State.Loaded
Run Code Online (Sandbox Code Playgroud)

我想让枚举成员作为Foo(如Foo.UnloadedFoo.LoadedFoo.Processed)的成员直接访问。有没有比手动分配更好的方法?

class Foo:
    class State(enum.Enum):
        Unloaded = enum.auto()
        Loaded = enum.auto()
        Processed = enum.auto()

    Unloaded = State.Unloaded
    Loaded = State.Loaded
    Processed = State.Processed

    state: State
Run Code Online (Sandbox Code Playgroud)

python enums class-variables

1
推荐指数
1
解决办法
55
查看次数

标签 统计

c++ ×4

c++11 ×2

awk ×1

bash ×1

bnf ×1

class-variables ×1

enums ×1

gcc ×1

grammar ×1

list ×1

parsing ×1

python ×1

sed ×1

std ×1

stl ×1

templates ×1