SORU
7 NİSAN 2013, Pazar


Rahat bir Derleme Zamanı Bildirmek C Dizeleri

Ve C derleme zamanı sırasında dizeler yaratmak ve işlemek için güçlü olmak birçok yararlı uygulamaları vardır. Derleme zamanı C dizeleri oluşturmak için mümkün olsa da , bu süreç dize karakter variadic bir sıra, örneğin olarak ilan edilmesi gerekiyor gibi çok hantal

using str = sequence<'H', 'e', 'l', 'l', 'o', ', ', 'w', 'o', 'r', 'l', 'd', '!'>;

Dize birleştirme gibi işlemler, çıkarma, ve diğerleri alt, kolayca karakter dizileri üzerinde işlem olarak uygulanabilir.Derleme zamanı bildirmek için olası dizeleri daha rahat mı? Derleme zamanı uygun Bildirgesi dizeleri için izin verecek işlere bir önerisi var?

Mevcut Yaklaşımlar Neden Başarısız

İdeal olarak, aşağıdaki gibi:-derleme dizeleri ilan etmesini istiyoruz

// Approach 1
using str1 = sequence<"Hello, world!">;

veya, kullanarak kullanıcı tanımlı hazır

// Approach 2
constexpr auto str2 = "Hello, world!"_s;

decltype(str2) constexpr yapıcı olabilirdi. Yaklaşım 1 messier bir sürüm uygulamak mümkün, aşağıdaki yapabileceğiniz olmanın avantajını kullanmış

template <unsigned Size, const char Array[Size]>
struct foo;

Ancak dizinin dış bağlantı olması gerekiyor, işe yaklaşım 1 almak için böyle bir şey yazmak zorunda kalalım diye:

/* Implementation of array to sequence goes here. */

constexpr const char str[] = "Hello, world!";

int main()
{
    using s = string<13, str>;
    return 0;
}

Söylemeye gerek yok, bu çok zahmetli bir iştir. Yaklaşım 2 aslında uygulamak mümkün değildir. (constexpr) gerçek bir operatör ilan olsaydık, nasıl dönüş türü belirtin. Operatör karakter variadic bir dizi dönmek için, dönüş türü belirtmek için const char* parametre kullanmak gerekir:

constexpr auto
operator"" _s(const char* s, size_t n) -> /* Some metafunction using `s` */

Bu sonuçları s constexpr olmadığı için hata derleme. Aşağıdaki işlemleri yaparak bu sorunu çözmek için çalışırken çok yardımcı olmuyor.

template <char... Ts>
constexpr sequence<Ts...> operator"" _s() { return {}; }

Standart, belirli bir edebi operatörden tamsayı ve kayan nokta türleri için ayrılmış olduğunu belirler. 123_s olsa çalışmak, abc_s olmaz. Ne biz hendek tanımlı kullanıcı rakamları tamamen ve sadece constexpr düzenli bir fonksiyonu kullanmak?

template <unsigned Size>
constexpr auto
string(const char (&array)[Size]) -> /* Some metafunction using `array` */

Daha önce olduğu gibi, bu dizi, şimdi constexpr fonksiyonu parametre, kendisi artık constexpr bir tür olduğunu sorun.

Sanırım öyle olmalı mümkün tanımlamak için bir C ön işlemci makro alır bir dize ve boyutu dize gibi değişkenler, ve döner bir dizi oluşan bir karakter dizesi (kullanarak BOOST_PP_FOR, stringification, bir dizi alt simgeler ve bu gibi). Ancak, zaman (ya da yeterince ilgi) böyle bir makro uygulamak için=) yok

CEVAP
7 NİSAN 2013, Pazar


Bir şey Scott Schurr's str_const zerafet C Now 2012 sunulan maç görmedim. constexpr gerçi gerektirir.

Bunu nasıl kullanabileceğinizi ve neler yapabileceğini burada:

int
main()
{
    constexpr str_const my_string = "Hello, world!";
    static_assert(my_string.size() == 13, "");
    static_assert(my_string[4] == 'o', "");
    constexpr str_const my_other_string = my_string;
    static_assert(my_string == my_other_string, "");
    constexpr str_const world(my_string, 7, 5);
    static_assert(world == "world", "");
//  constexpr char x = world[5]; // Does not compile because index is out of range!
}

-Derleme zamanı kontrol aralığı çok daha soğuk olamaz!

Hem kullanımı ve uygulanması, makro ücretsizdir. Ve dize boyutu yapay sınırı yoktur. Uygulama buraya post ederim, ama Scott'ın örtülü telif hakkına saygı duyuyorum. Uygulama sunumu tek bir slayt yukarıda bağlantılı.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Evan Coury

    Evan Coury

    29 NİSAN 2007
  • Howard Pinsky

    Howard Pinsk

    6 AĞUSTOS 2006
  • SaMmM123

    SaMmM123

    3 Mayıs 2006