考虑这样一个类
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>;