fork download
  1. #include <iostream>
  2. #include <array>
  3. #include <string>
  4.  
  5. // Hilfsstrukturen zur Generierung einer Sequenz zwecks statischer Iteration
  6.  
  7. template<unsigned int...> struct Seq{ using type = Seq; };
  8.  
  9. template<class S1, class S2> struct ConcatI;
  10.  
  11. template<unsigned int... I1, unsigned int... I2>
  12. struct ConcatI<Seq<I1...>, Seq<I2...>>
  13. : Seq<I1..., (sizeof...(I1)+I2)...>{};
  14.  
  15. template<class S1, class S2>
  16. using Concat = typename ConcatI<S1, S2>::type;
  17.  
  18. template<size_t N> struct GenSeqI;
  19. template<size_t N> using GenSeq = typename GenSeqI<N>::type;
  20.  
  21. template<size_t N>
  22. struct GenSeqI : Concat<GenSeq<N/2>, GenSeq<N - N/2>>{};
  23.  
  24. template<> struct GenSeqI<0> : Seq<>{};
  25. template<> struct GenSeqI<1> : Seq<0>{};
  26.  
  27. // Hilfsstrukturen zum Zuschneiden des Strings
  28.  
  29. template <size_t N, size_t C, typename X>
  30. struct Helper;
  31.  
  32. template <size_t N, size_t C, size_t... I>
  33. struct Helper<N, C, Seq<I...>> {
  34. constexpr static std::array<char, C+1> cut (const char (&str) [N]) {
  35. return {{ str [I]..., 0 }};
  36. }
  37. };
  38.  
  39. /*
  40.   Zuschneide-Funktion schneidet ein String (char-Array) und gibt ein std::array<char,C+1> mit der gewünschten Länge zurück
  41.   inklusive Null-Byte. C gibt die gewünschte String-Länge an.
  42. */
  43. template <size_t C, size_t N>
  44. constexpr std::array<char, C+1> cutString (const char (&str) [N]) {
  45. return Helper<N, C, GenSeq<C>>::cut (str);
  46. }
  47.  
  48. // Beispiel #1
  49.  
  50. // Schneide String.
  51. constexpr auto x = cutString<3> (__VERSION__);
  52. // x.data() ist jetzt ein const char* von der Länge x.size() = 3.
  53.  
  54. int main () {
  55. // Gebe String von Beispiel #1 aus.
  56. std::cout << x.data () << '\n';
  57.  
  58.  
  59. // Beispiel #2
  60. constexpr auto y = cutString<5> ("Hello, world!");
  61. std::cout << y.data () << '\n';
  62.  
  63. return 0;
  64. }
Success #stdin #stdout 0s 3296KB
stdin
Standard input is empty
stdout
4.8
Hello