SORU
4 HAZİRAN 2010, Cuma


Programlı C derleme zamanında statik bir dizi oluşturun

Aşağıdaki gibi derleme zamanında static bir dizi tanımlayabilirsiniz

const std::size_t size = 5;    
unsigned int list[size] = { 1, 2, 3, 4, 5 };

Soru 1- Mümkün teknikleri bu değerleri atamak için metaprogramming çeşitli kullanarak "programlı" derleme zamanında?

Soru 2- Dizideki tüm değerleri barr aynı birkaç varsayarak, mümkün seçici olarak programlı bir şekilde derleme zamanında değerini belirlemek için.

örneğin:

const std::size_t size = 7;        
unsigned int list[size] = { 0, 0, 2, 3, 0, 0, 0 };
  1. Çözüm C 0 x kullanarak bekliyoruz
  2. Dizi oldukça büyük, az olabilir yüz elemanları uzun
  3. Şimdi dizinin tek oluşacaktır POD türleri
  4. Ayrıca boyutu kabul edilebilir dizi önceden belli olacak derleme bir statik uyumlu şekilde.
  5. Çözüm C olmalıdır(senaryo yok, makrolar, hiçbir pp ya da kod tabanlı çözümler jeneratör pls)

GÜNCELLEME:Georg Fritzsche çözüm şaşırtıcı, msvc ve ıntel Derleyiciler derleme için biraz daha çalışmak gerek, ama yine de sorun çok ilginç bir yaklaşım.

CEVAP
5 HAZİRAN 2010, CUMARTESİ


Alabileceğiniz en yakın C 0 x özellikleri variadic şablon argüman listesinden şablonları yerel ya da üye diziler başlatmak için kullanıyor.
Bu tabii ki aslında senin durumunda önemli bir fark yaratan derinlik ve hava ölçüm yapılacak olurdu azami şablon örnekleme ile sınırlıdır.

Örnek:

template<unsigned... args> struct ArrayHolder {
    static const unsigned data[sizeof...(args)];
};

template<unsigned... args> 
const unsigned ArrayHolder<args...>::data[sizeof...(args)] = { args... };

template<size_t N, template<size_t> class F, unsigned... args> 
struct generate_array_impl {
    typedef typename generate_array_impl<N-1, F, F<N>::value, args...>::result result;
};

template<template<size_t> class F, unsigned... args> 
struct generate_array_impl<0, F, args...> {
    typedef ArrayHolder<F<0>::value, args...> result;
};

template<size_t N, template<size_t> class F> 
struct generate_array {
    typedef typename generate_array_impl<N-1, F>::result result;
};

1..5 davanız için kullanımı:

template<size_t index> struct MetaFunc { 
    enum { value = index   1 }; 
};

void test() {
    const size_t count = 5;
    typedef generate_array<count, MetaFunc>::result A;

    for (size_t i=0; i<count;   i) 
        std::cout << A::data[i] << "\n";
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Epic Tutorials for iPhone, iPad and iOS

    Epic Tutoria

    18 EYLÜL 2011
  • kylediablo

    kylediablo

    8 Ocak 2007
  • WK

    WK

    9 Ocak 2006