Lassen Sie mich erklären, was ich mit Code suche. Lassen Sie uns nehme an wir eine Vorlage haben eine Reihe Einwickeln:Sub-Array-Vorlage
template <typename T, std::size_t SIZE>
struct wrap
{
using value_type = T;
using wrap_type = wrap;
static constexpr auto size = SIZE;
T data[size]{};
};
Ich möchte eine Funktion zum wrap
Vorlage hinzufügen, sollte diese Funktion ein Objekt der Lage zurückzukehren einen bestimmten Teil des Arrays in wrap
, die Funktion enthalten sind, zu manipulieren wissen sollte, wo das Sub-Array beginnt und wie viele Elemente wird es haben, so dachte ich über eine Funktion wie folgt aus:
template <typename T, std::size_t SIZE>
struct wrap
{
using value_type = T;
using wrap_type = wrap;
static constexpr auto size = SIZE;
T data[size]{};
template <std::size_t START, std::size_t COUNT>
???? sub() { ... }
};
ich will nicht das ????
Objekt von wrap::sub
zurück ein paar Hinweise haben, aber ein statisches Array, so war mein Ansatz:
template <typename T, std::size_t SIZE>
struct wrap
{
using value_type = T;
using wrap_type = wrap;
static constexpr auto size = SIZE;
T data[size]{};
template <std::size_t START, std::size_t COUNT>
struct sub_array
{
using value_type = wrap_type::value_type *;
static constexpr auto start = START;
static constexpr auto count = COUNT;
value_type data[count]{};
};
template <std::size_t START, std::size_t COUNT>
sub_array<START, COUNT> sub() { ... }
};
Und hier ist das Problem: Was soll ich in wrap::sub
schreiben? Ich bin mir ziemlich sicher, dass ein Ansatz mit std::integer_sequence
möglich sein sollte, aber ich habe keine Erfahrung damit, daher weiß ich nicht einmal, was ich versuchen soll. Ich habe versucht, einen Wert von 2
mit beiden Template-Parameter in wrap::sub
asume und es funktionierte wie erwartet:
template <std::size_t START, std::size_t SIZE>
sub_array<START, SIZE> sub() { return { &data[START], &data[START + 1u] }; }
ich habe es ausprobiert wie ich weiter unten zeigen:
wrap<int, 9> w{1, 2, 3, 4, 5, 6, 7, 8, 9};
// x is the view [3, 4]
auto x = w.sub<2, 2>();
std::cout << *x.data[0] << '\n'; // shows 3
Also, konzeptionell die Körper von wrap::sub
sollte sein:
return { &data[START + 0], &data[START + 1], ... &data[START + n] };
Wie soll ich die Wirkung oben erreichen?
Ein Sub-Array, das ein tatsächliches Array ist, ist keine Ansicht wie in 'string_view'. Es ist eine Kopie eines Teils des Arrays. Dies sind unterschiedliche Konzepte. Bitte klären Sie mit dem Rückgabewert von 'sub()', welche genauen Eigenschaften Sie haben möchten. – Yakk
Die Eigenschaften sind: ein Objekt zu haben, das in der Lage ist, einen Unterteil des im 'wrap'-Objekt enthaltenen Arrays zu manipulieren. Ich werde die Referenz "string_view" loswerden. –
Ihr Entwurf gibt eine Kopie des Unterteils des Arrays zurück. Änderungen an diesem Unterpart werden nicht im ursprünglichen Array angezeigt, da Sie eine Kopie erstellt haben. – Yakk