Pergunta

C ++ 0x permitirá modelo para ter um número arbitrário de argumentos. Qual é o melhor uso desta excepção implementação tuplas recurso?

Foi útil?

Solução

  1. tipo seguro printf
  2. Encaminhamento de arbitrárias muitos argumentos do construtor em métodos fábrica
  3. Tendo arbitrária base de classes permite a colocação e remoção úteis políticas .
  4. Inicializar movendo tipado heterogénea objetos directamente para um recipiente, tendo um construtor template'd variádica.
  5. Ter um operador literal que pode calcular um valor para um usuário definido literal (como "10110b").

Sample a 3:

template<typename... T> struct flexible : T... { flexible(): T()... { } };

Amostra de 4:

struct my_container { template<typename... T> my_container(T&&... t) { } };
my_container c = { a, b, c };

Sample a 5:

template<char... digits>
int operator "" b() { return convert<digits...>::value; }

Veja este exemplo de código: aqui

Outras dicas

Talvez a conversa por Andrei Alexandrescu no Native Indo 2.012 evento, será de seu interesse:

Aqui é o vídeo e Aqui a documentação.

  • tipo seguro printf

Permitir que coisas como Boost.Function tomar números arbitrários de parâmetros

Eu só escreveu um artigo sobre como implementar várias interfaces COM e mantê seu compacto código e elegante, com C ++ 0x variádica modelos.

Eu tenho implementado um NDArray (array N-dimensional) e tem as SetSizes método com contagem de aridade variável de argumentos. Usando argumentos de modelo variádicos é tipo seguro do que usar argumentos da função variádicos, além disso eu posso controlar a contagem de parâmetros passados ??para esta função em tempo de compilação apenas com argumentos de modelo variádicos.

void setSizes(uintmax_t currentSize) {
    static_assert(1 == NDimensions, "Invalid count of arguments given to setSizes.");

    size_ = currentSize;
    data_ = new NDArrayReferenceType[currentSize];
}

template <typename... Sizes>
void setSizes(uintmax_t currentSize, Sizes... sizes) {
    static_assert(sizeof...(Sizes) + 1 == NDimensions, "Invalid count of arguments given to setSizes.");

    size_ = currentSize;
    data_ = new NDArrayReferenceType[currentSize];

    for (uintmax_t i = 0; i < currentSize; i++) {
        data_[i]->setSizes(sizes...);
    }
}

Eu também implementaram um invólucro construtor universal para o meu self-made ponteiro inteligente. Ela envolve sobre toda construtor definido pelo usuário do tipo de ponteiro bruto.

template <typename TSmartPointer, typename... Args>
static inline void initialize(TSmartPointer *smartPointer, Args... args) {
    smartPointer->pointer_ = new typename TSmartPointer::PointerType(std::forward<Args>(args)...);
    smartPointer->__retain();
}

Este código parece ser inobvious, esta é uma parte do inicializador do ponteiro inteligente para o caso se ponteiro inteligente deve chamar automaticamente o construtor de ponteiro na aquisição do ponteiro inteligente (RAII). Em caso de classes abstratas não é capaz de chamar o construtor.

Então, se eu tiver um tipo AbstractObject, que é ponteiro inteligente de uma classe abstrata, e o tipo ConcreteObject, que é ponteiro inteligente da classe com construtor que leva dois inteiros, eu posso escrever código a seguir:

AbstractObject object = ConcreteObject(42, 42);

É como C # e Java (mas com RAII) e ele funciona para mim em C ++ / GCC 4.8 =)

Tipo de segurança de cada chamada com o argumento número dinâmica.

printf tipo seguro foi mencionado em outras respostas, mas mais geralmente modelos variádicos podem ser usados ??para implementar funções de formatação que não necessitam de passar informações de tipo via especificadores de formato em tudo. Por exemplo, a biblioteca Format C ++ implementa a formatação funções semelhantes às do Python str.format :

fmt::print("I'd rather be {1} than {0}.", "right", "happy");

Além de printf seguro. Os tipos de argumentos são capturadas automaticamente usando modelos variádicos em C ++ 11.

Isso faz com especificadores printf como lld ou PRIdPTR notório desnecessária e, em vez de

std::printf("Local number: %" PRIdPTR "\n\n", someIntPtr);

pode-se simplesmente usar

fmt::printf("Local number: %d\n\n", someIntPtr);

Aviso : Eu sou o autor desta biblioteca

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top