#include <iostream>
#include <array>
#include <string>
// Hilfsstrukturen zur Generierung einer Sequenz zwecks statischer Iteration
template<unsigned int...> struct Seq{ using type = Seq; };
template<class S1, class S2> struct ConcatI;
template<unsigned int... I1, unsigned int... I2>
struct ConcatI<Seq<I1...>, Seq<I2...>>
: Seq<I1..., (sizeof...(I1)+I2)...>{};
template<class S1, class S2>
using Concat = typename ConcatI<S1, S2>::type;
template<size_t N> struct GenSeqI;
template<size_t N> using GenSeq = typename GenSeqI<N>::type;
template<size_t N>
struct GenSeqI : Concat<GenSeq<N/2>, GenSeq<N - N/2>>{};
template<> struct GenSeqI<0> : Seq<>{};
template<> struct GenSeqI<1> : Seq<0>{};
// Hilfsstrukturen zum Zuschneiden des Strings
template <size_t N, size_t C, typename X>
struct Helper;
template <size_t N, size_t C, size_t... I>
struct Helper<N, C, Seq<I...>> {
constexpr static std::array<char, C+1> cut (const char (&str) [N]) {
return {{ str [I]..., 0 }};
}
};
/*
Zuschneide-Funktion schneidet ein String (char-Array) und gibt ein std::array<char,C+1> mit der gewünschten Länge zurück
inklusive Null-Byte. C gibt die gewünschte String-Länge an.
*/
template <size_t C, size_t N>
constexpr std::array<char, C+1> cutString (const char (&str) [N]) {
return Helper<N, C, GenSeq<C>>::cut (str);
}
// Beispiel #1
// Schneide String.
constexpr auto x = cutString<3> (__VERSION__);
// x.data() ist jetzt ein const char* von der Länge x.size() = 3.
int main () {
// Gebe String von Beispiel #1 aus.
std::cout << x.data () << '\n';
// Beispiel #2
constexpr auto y = cutString<5> ("Hello, world!");
std::cout << y.data () << '\n';
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YXJyYXk+CiNpbmNsdWRlIDxzdHJpbmc+CgovLyBIaWxmc3N0cnVrdHVyZW4genVyIEdlbmVyaWVydW5nIGVpbmVyIFNlcXVlbnogendlY2tzIHN0YXRpc2NoZXIgSXRlcmF0aW9uCgp0ZW1wbGF0ZTx1bnNpZ25lZCBpbnQuLi4+IHN0cnVjdCBTZXF7IHVzaW5nIHR5cGUgPSBTZXE7IH07Cgp0ZW1wbGF0ZTxjbGFzcyBTMSwgY2xhc3MgUzI+IHN0cnVjdCBDb25jYXRJOwoKdGVtcGxhdGU8dW5zaWduZWQgaW50Li4uIEkxLCB1bnNpZ25lZCBpbnQuLi4gSTI+CnN0cnVjdCBDb25jYXRJPFNlcTxJMS4uLj4sIFNlcTxJMi4uLj4+CiAgOiBTZXE8STEuLi4sIChzaXplb2YuLi4oSTEpK0kyKS4uLj57fTsKCnRlbXBsYXRlPGNsYXNzIFMxLCBjbGFzcyBTMj4KdXNpbmcgQ29uY2F0ID0gdHlwZW5hbWUgQ29uY2F0STxTMSwgUzI+Ojp0eXBlOwoKdGVtcGxhdGU8c2l6ZV90IE4+IHN0cnVjdCBHZW5TZXFJOwp0ZW1wbGF0ZTxzaXplX3QgTj4gdXNpbmcgR2VuU2VxID0gdHlwZW5hbWUgR2VuU2VxSTxOPjo6dHlwZTsKCnRlbXBsYXRlPHNpemVfdCBOPgpzdHJ1Y3QgR2VuU2VxSSA6IENvbmNhdDxHZW5TZXE8Ti8yPiwgR2VuU2VxPE4gLSBOLzI+Pnt9OwoKdGVtcGxhdGU8PiBzdHJ1Y3QgR2VuU2VxSTwwPiA6IFNlcTw+e307CnRlbXBsYXRlPD4gc3RydWN0IEdlblNlcUk8MT4gOiBTZXE8MD57fTsKCQovLyBIaWxmc3N0cnVrdHVyZW4genVtIFp1c2NobmVpZGVuIGRlcyBTdHJpbmdzCgp0ZW1wbGF0ZSA8c2l6ZV90IE4sIHNpemVfdCBDLCB0eXBlbmFtZSBYPgpzdHJ1Y3QgSGVscGVyOwoKdGVtcGxhdGUgPHNpemVfdCBOLCBzaXplX3QgQywgc2l6ZV90Li4uIEk+CnN0cnVjdCBIZWxwZXI8TiwgQywgU2VxPEkuLi4+PiB7Cgljb25zdGV4cHIgc3RhdGljIHN0ZDo6YXJyYXk8Y2hhciwgQysxPiBjdXQgKGNvbnN0IGNoYXIgKCZzdHIpIFtOXSkgewoJCXJldHVybiB7eyBzdHIgW0ldLi4uLCAwIH19OwoJfQp9OwoKLyoKICBadXNjaG5laWRlLUZ1bmt0aW9uIHNjaG5laWRldCBlaW4gU3RyaW5nIChjaGFyLUFycmF5KSB1bmQgZ2lidCBlaW4gc3RkOjphcnJheTxjaGFyLEMrMT4gbWl0IGRlciBnZXfDvG5zY2h0ZW4gTMOkbmdlIHp1csO8Y2sKICBpbmtsdXNpdmUgTnVsbC1CeXRlLiBDIGdpYnQgZGllIGdld8O8bnNjaHRlIFN0cmluZy1Mw6RuZ2UgYW4uCiovCnRlbXBsYXRlIDxzaXplX3QgQywgc2l6ZV90IE4+CmNvbnN0ZXhwciBzdGQ6OmFycmF5PGNoYXIsIEMrMT4gY3V0U3RyaW5nIChjb25zdCBjaGFyICgmc3RyKSBbTl0pIHsKCXJldHVybiBIZWxwZXI8TiwgQywgR2VuU2VxPEM+Pjo6Y3V0IChzdHIpOwp9CgovLyBCZWlzcGllbCAjMQoKLy8gU2NobmVpZGUgU3RyaW5nLgpjb25zdGV4cHIgYXV0byB4ID0gY3V0U3RyaW5nPDM+IChfX1ZFUlNJT05fXyk7Ci8vIHguZGF0YSgpIGlzdCBqZXR6dCBlaW4gY29uc3QgY2hhciogdm9uIGRlciBMw6RuZ2UgeC5zaXplKCkgPSAzLgoKaW50IG1haW4gKCkgewoJLy8gR2ViZSBTdHJpbmcgdm9uIEJlaXNwaWVsICMxIGF1cy4KCXN0ZDo6Y291dCA8PCB4LmRhdGEgKCkgPDwgJ1xuJzsKCQoJCgkvLyBCZWlzcGllbCAjMgoJY29uc3RleHByIGF1dG8geSA9IGN1dFN0cmluZzw1PiAoIkhlbGxvLCB3b3JsZCEiKTsKCXN0ZDo6Y291dCA8PCB5LmRhdGEgKCkgPDwgJ1xuJzsKCQoJcmV0dXJuIDA7Cn0=