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
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ı.
Nasıl azaltmak için inşa kez böyle büy...
Nasıl derleme zamanı (katlanarak) daha...
AngularJS - dinamik HTML dizeleri Derl...
Derleme zamanı dize karma...
Nasıl bir derleme zamanı ** sınıf tanı...