Wie teilen Sie ein Intervall unter Verwendung von variadischen Vorlagen in eine willkürliche Anzahl von Unterintervalen C++

Programme in C++. Entwicklerforum
Anonymous
 Wie teilen Sie ein Intervall unter Verwendung von variadischen Vorlagen in eine willkürliche Anzahl von Unterintervalen

Post by Anonymous »

Ich möchte eine benutzerdefinierte Intervallklasse in kleinere Unterintervalen teilen. Die Anzahl der Subintervalle hängt von der Anzahl der angegebenen Argumente ab.

Code: Select all

class interval
{
public:
interval(std::string_view name, float start, float end)
: name(name)
, start(start)
, end(end)
{
if (start >= end)
throw std::invalid_argument("`start` must be smaller than `end`!");
}

interval split_off_chunk(std::string_view name, float relStart,
float relEnd) const
{
if (!((0 template
consteval bool CheckArgs() {
if (sizeof...(Args) % 2 != 1)
return false;
if (sizeof...(Args) < 3)
return false;
// howto check alternating string_view, float ???
}

template
consteval size_t GetCount() { return (sizeof...(Args)+1)/2; }

template
requires (CheckArgs())
std::array split(Args... args) {
// howto extract the names and relSplit floats?
// howto create the array and initialize with the proper arguments?
}
< /code>
Es sollte ziemlich effizient sein, z. Keine unnötigen Zwischenvektorobjekte.class interval {
public:
interval(std::string_view name, float start, float end, bool flag = true);

interval split_off_chunk(std::string_view name, float relStart, float relEnd,
bool flag = true) const {
// ...
return {name, childStart, childEnd, flag};
}

std::array split(std::string_view name0, float relSplit01,
std::string_view name1, bool flag = true) const {
// ...
return {split_off_chunk(name0, 0, relSplit01, flag),
split_off_chunk(name1, relSplit01, 1, flag)};
}

std::array split(std::string_view name0, float relSplit01,
std::string_view name1, float relSplit12,
std::string_view name2, bool flag = true) const;
// ...
bool flag;
};
< /code>

 Bonus 2 < /strong>
Derzeit starten die Unterintervalen immer bei 0 und enden bei 1. Kann das optional angepasst werden? Z.B.  Das Argument Variadic Template Argument 
wird überprüft, wenn sein erster Typ ein Float ist. Wenn ja, dann verwenden Sie diesen anstelle des Standardwerts 0 -Wert. für den letzten Wert?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post