看来C++ 11支持高达六种不同的正则表达式语法:
为什么决定包含这么多选项而不是单一语法?为什么这些特别6?
我正在尝试使用模板递归来生成嵌套的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++ 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)
标准中是否省略了具体原因?
我目前有一个采用一系列类型的类模板。每种类型可能需要使用类本身进行实例化。我目前拥有的是这样的:
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?