Um auch unsigned int
und andere Arten zu annehmen, die int
umwandelbar sind, und wenn Sie eine Obergrenze annehmen kann (63, im folgenden Beispiel) auf die Anzahl der Integer-Argument, schlage ich vor, an example from W.F. zu folgen.
So können Sie entwickeln eine typer
template <typename T, std::size_t>
using typer = T;
und eine rekursive struct proOp
template <typename T, std::size_t N = 64U,
typename = std::make_index_sequence<N>>
struct proOp;
template <typename T, std::size_t N, std::size_t... Is>
struct proOp<T, N, std::index_sequence<Is...>> : public proOp<T, N-1U>
{
using proOp<T, N-1U>::operator();
void operator() (typer<T, Is>... ts)
{ }
};
template <typename T>
struct proOp<T, 0U, std::index_sequence<>>
{
void operator()()
{ }
};
von proOp<int>
Vererben, Tensor
werden
struct Tensor : public proOp<int>
{
using proOp<int>::operator();
};
Das Folgende ist ein voll funktionierendes Beispiel
#include <utility>
template <typename T, std::size_t>
using typer = T;
template <typename T, std::size_t N = 64U,
typename = std::make_index_sequence<N>>
struct proOp;
template <typename T, std::size_t N, std::size_t... Is>
struct proOp<T, N, std::index_sequence<Is...>> : public proOp<T, N-1U>
{
using proOp<T, N-1U>::operator();
void operator() (typer<T, Is>... ts)
{ }
};
template <typename T>
struct proOp<T, 0U, std::index_sequence<>>
{
void operator()()
{ }
};
struct Tensor : public proOp<int>
{
using proOp<int>::operator();
};
int main()
{
Tensor t;
t(1, 2, 3);
t(1, 2, 3, 4U); // accept also unsigned
//t(1, "two"); // error
}
Was variadische Template-Parameter-Pack machen sein? – user0042
Sie können variante C++ - Vorlagen verwenden und das Argument als einen bestimmten Typ (oder konvertierbar in einen bestimmten Typ) definieren. Die Verwendung der resultierenden Parameterpakete ist jedoch ein wenig mühsam. –
Ist die tensors-Dimension eine Laufzeiteigenschaft oder eine Kompilierzeiteigenschaft? – StoryTeller