ich eine Klasse foo
mit Template-Parameter haben konstruiert werden Tuple
und ich möchte ein variadische Argumente Konstruktor, um eine Membervariable m_elements
vom Typ Tuple
, zu initialisieren, wenn der Ausdruck m_elements{ static_cast<typename Tuple::value_type>(std::forward<Elements>(elements))... }
ist definiert.Bedingtes einen Konstruktor ermöglichen, wenn eine Membervariable kann durch variadische Argumente
Wir können dies tun, auf folgende Weise:
template<class Tuple>
struct foo
{
using value_type = typename Tuple::value_type;
template<class... Elements, class U = Tuple,
class = decltype(U{ static_cast<value_type>(std::declval<Elements>())... })>
foo(Elements&&... elements)
: m_elements{ static_cast<value_type>(std::forward<Elements>(elements))... }
{}
Tuple m_elements;
};
Nun, ob dieser Konstruktor aktiviert ist oder nicht zu sehr auf einigen anderen Bedingungen abhängen. So würde ich brauche
etwas wietemplate<class... Elements, class U = Tuple,
class = std::enable_if_t</* some other conditions depending on U */>,
class = decltype(U{ static_cast<value_type>(std::declval<Elements>())... })>
schreiben Ich mag wäre meine erste Bedingung in Bezug auf std::is_constructible
so prüfen, dass ich diese Prüfung in die enable_if
bewegen konnte. Ist das möglich? Ich habe versucht, std::is_constructible_v<U, decltype(static_cast<value_type>(std::declval<Elements>()))...>
zu verwenden, aber das scheint der vorherigen Überprüfung nicht zu entsprechen.
Zum Beispiel foo<bar<3>>{1, 2, 3};
mit
template<std::size_t N>
struct bar
{
using value_type = double;
double data[N];
};
wird mit der vorherigen Überprüfung kompilieren, sondern ergibt sich ein Fehler mit dem neuen.
Ironischerweise funktioniert 'foo' nicht, wenn' Tuple' = 'std :: tuple', weil' std :: tuple' kein 'value_type'-Attribut hat, also arbeiten Sie nicht * wirklich * mit Tupeln (im Sinne heterogener Kompilierzeitsammlungen). – Tim
@Tim Es ist nicht so ironisch. Mein richtiger 'foo' ist in einer Mathebibliothek und ein Mathematiker definiert normalerweise einen Vektor als ein n-Tupel. – 0xbadf00d
Ah, * das * Art von Tupel. Das macht viel mehr Sinn. – Tim