小编rkj*_*nsn的帖子

为什么C++ 11支持6种不同的正则表达式语法?

看来C++ 11支持高达六种不同的正则表达式语法:

  • ECMA-262(ECMAScript)正则表达式(略有修改?)
  • 基本POSIX正则表达式
  • 扩展的POSIX正则表达式
  • awk正则表达式
  • grep正则表达式
  • egrep正则表达式

为什么决定包含这么多选项而不是单一语法?为什么这些特别6?

c++ regex std c++11

13
推荐指数
2
解决办法
2142
查看次数

初始化模板化,递归,POD结构

我正在尝试使用模板递归来生成嵌套的POD结构,我遇到了一些我没想到的行为.这是一个简化的测试用例:

#include <cstddef>

template<std::size_t size>
struct RecursiveStruct {
public:
    template <std::size_t start, std::size_t length>
    struct Builder {
        static const Builder value;
        static const size_t mid = start + length / 2;
        static const size_t end = start + length;
        Builder<start, mid - start> left;
        Builder<mid, end - mid> right;
    };

    template <std::size_t start>
    struct Builder<start, 1> {
        static const Builder value;
        int data;
    };

    static const Builder<0, size> result;
};

template<std::size_t size>
const typename RecursiveStruct<size>::template Builder<0, size>
        RecursiveStruct<size>::result = Builder<0, …
Run Code Online (Sandbox Code Playgroud)

c++ templates initialization

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

为什么C++ 11中没有向量(size_type n,const Allocator&alloc)?

在C++ 11中,std :: vector具有构造函数vector(size_type n),该构造函数将默认构造n项目,可以使用默认的可构造,可移动,不可复制的类.

但是,与其他所有向量构造函数不同,没有采用分配器的变体,我采用了以下方法:

// Foo is default constructible and moveable, but not copyable
const int n = 10; // Want 10 default constructed Foos
std::vector<Foo, CustomAllocator> foos(allocator);
foos.reserve(n);
for (int i = 0; i < n; ++i)
   foos.emplace_back();
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来实现这一目标?vector(size_type n, const Allocator& alloc)标准中是否省略了具体原因?

c++ vector allocator c++11

6
推荐指数
2
解决办法
325
查看次数

防止模板参数上的 ADL

我目前有一个采用一系列类型的类模板。每种类型可能需要使用类本身进行实例化。我目前拥有的是这样的:

template <typename... Types>
struct TypeList; // Not defined

struct Placeholder; // Not defined

template <typename Types, typename AnotherType = Default>
class MyClass
{
    // ...
};
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它:

typedef MyClass<TypeList<Container1<Placeholder>, Container2<std::string,
        Placeholder>, OtherType>, OptionalType> MyTypedef;
MyTypedef my_object;
Run Code Online (Sandbox Code Playgroud)

MyClass将取代的外观Placeholder,使用结果类型,一切都很好。

当我尝试执行以下任一操作时,就会出现问题:

MyTypedef *my_ptr = &my_object;
my_free_function(my_object);
Run Code Online (Sandbox Code Playgroud)

这两者都会导致编译器错误,因为编译器尝试实例化Container1<Placeholder>Container2<std::string, Placeholder>执行参数相关查找(ADL),并且此实例化使用Placeholder, 本身的实例化失败。

我知道可以通过以下方式避免 ADL:

MyTypedef *my_ptr = std::addressof(my_object);
(my_free_function)(my_object);
Run Code Online (Sandbox Code Playgroud)

然而,我不想给用户带来MyClass必须不断抑制 ADL 的负担。是否有另一种直接的方法让用户提供类型列表而不将这些类型用于 ADL?

c++ templates

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

标签 统计

c++ ×4

c++11 ×2

templates ×2

allocator ×1

initialization ×1

regex ×1

std ×1

vector ×1