Articles of c ++ 11

Por que a dedução de argumento de modelo é desativada com std :: forward?

No VS2010 std :: forward é definido como tal: template inline _Ty&& forward(typename identity::type& _Arg) { // forward _Arg, given explicitly specified type parameter return ((_Ty&&)_Arg); } identity parece ser usada apenas para desabilitar a dedução do argumento de modelo. Qual é o propósito de desabilitá-lo intencionalmente neste caso?

initializer_list e dedução de tipo de modelo

Considere a function: template void printme(T&& t) { for (auto i : t) std::cout << i; } ou qualquer outra function que espera um parâmetro com um tipo iniciado () / end (). Por que o seguinte é ilegal? printme({‘a’, ‘b’, ‘c’}); Quando tudo isso é legítimo: printme(std::vector({‘a’, ‘b’, ‘c’})); printme(std::string(“abc”)); printme(std::array {‘a’, ‘b’, ‘c’}); […]

É o tamanho de std :: array definido por padrão

Em C ++ 11 std::array é definido para ter armazenamento contíguo e desempenho que não é pior do que uma matriz, mas eu não posso decidir se os vários requisitos da norma implicam que std :: array tem o mesmo tamanho e memory layout como uma matriz normal. Isto é, você pode contar com sizeof(std::array) […]

Hash genérico para tuplas em unordered_map / unordered_set

Por que o std::unordered_map<tuple, string> não funciona imediatamente? É tedioso ter que definir uma function hash para tuple , por exemplo template struct do_hash<tuple> { size_t operator()(std::tuple const& tt) const {…} }; Construir um mapa desordenado com tuplas como chaves (Matthieu M.) mostra como automatizar isso para boost::tuple . Existe alguma maneira de fazer isso […]

O mais simples e mais limpo c + + 11 ScopeGuard

Eu estou tentando escrever um ScopeGuard simples baseado em conceitos Alexandrescu, mas com idiomas c ++ 11. namespace RAII { template class ScopeGuard { mutable bool committed; Lambda rollbackLambda; public: ScopeGuard( const Lambda& _l) : committed(false) , rollbackLambda(_l) {} template ScopeGuard( const AdquireLambda& _al , const Lambda& _l) : committed(false) , rollbackLambda(_l) { _al(); } […]

Inicializando uma matriz de membros no inicializador de construtor

class C { public: C() : arr({1,2,3}) //doesn’t compile {} /* C() : arr{1,2,3} //doesn’t compile either {} */ private: int arr[3]; }; Eu acredito que a razão é que as matrizes podem ser inicializadas apenas com = syntax, ou seja: int arr[3] = {1,3,4}; Questões Como posso fazer o que eu quero fazer (isto […]

Como chamar uma function em todos os argumentos do modelo variádico?

eu gostaria de fazer template void print(ArgTypes… Args) { print(Args)…; } E seja equivalente a essa cadeia recursiva bastante volumosa: template void print(const T& t, ArgTypes… Args) { print(t); print(Args…); } seguido por especializações explícitas de parâmetro único para cada tipo que eu gostaria de imprimir. O “problema” com a implementação recursiva é que muito […]

Diferenças entre std :: make_unique e std :: unique_ptr

O std::make_unique tem algum benefício de eficiência como o std::makes_shared ? Comparado com a construção manual de std::unique_ptr : std::make_unique(1); // vs std::unique_ptr(new int(1));

Posso usar o C ++ 11 com o Xcode?

Estou considerando o uso de alguns resources do C ++ 11 (como o auto por exemplo) em alguns projetos de plataforma cruzada (Windows + Mac). No Windows, o Visual Studio suporta partes do próximo padrão C ++ 11 que me permitiria simplificar partes da base de código, então naturalmente eu estaria interessado em começar a […]

Como verificar se um std :: thread ainda está em execução?

Como posso verificar se um std::thread ainda está em execução (de maneira independente da plataforma)? Falta um método timed_join() e joinable() não é para isso. Eu pensei em bloquear um mutex com um std::lock_guard no thread e usando o método try_lock() do mutex para determinar se ele ainda está bloqueado (o thread está sendo executado), […]