模板可以决定C++中的参数数量

Can template decide the number of arguments in C++?

本文关键字:参数 数数 C++ 决定      更新时间:2023-10-16

考虑这样的类

template<int n, class T>
class dimArray {
    T* arr;
    int len[n];
public:
    dimArray(int len₀, int len₁, int len₂, ..., int lenₕ₋₁, T initValue);
    T& at(int x₀, int x₁, int x₂, ..., int xₕ₋₁);
    void foo(int x₀, int x₁, int x₂, ..., int xₕ₋₁, .../*va_args*/);
}

使用者

dimArray<2, double> a(3,4, 1.0);
a.at(1,2) = 4.3;
std::cout << a.at(2,3);
a.foo(1,2, 7.3,4.2,0);

len₀等是 p 代码。有可能在C++中制造这样的东西吗?如果是这样,如何?

您可以使用

可变参数模板和std::index_sequence实用程序来执行此操作:

template <std::size_t I, typename T>
using always_t = T;
template<typename Seq, class T>
class dimArrayImpl;
template<std::size_t ... Is, class T>
class dimArrayImpl<std::index_sequence<Is...>, T>
{
    T* arr;
    int len[sizeof...(Is)];
public:
    dimArrayImpl(always_t<Is, int>... lens, T initValue);
    T& at(always_t<Is, int>... lens);
    void foo(always_t<Is, int>... lens, .../*va_args*/);
};
template<int n, class T>
using dimArray = dimArrayImpl<std::make_indexsequence<n>, T>;