gpt4 book ai didi

c++ - 类模板中 std::array 的大小取决于模板参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:42:03 25 4
gpt4 key购买 nike

我有一个下面的类模板

template<int N>
constexpr int arraySize() { return arraySize<N-1>() + N; }

template<>
constexpr int arraySize<0>() { return 0; }

template<int C>
class MyClass {
public:
std::array<int, arraySize<C>()> arr;
};

int main() {

MyClass<3> cls;
std::cout << cls.arr.size() << std::endl; // Output: 6
}

一切正常,但我想要 calculateArraySize<N>()作为成员函数。我尝试了以下方法:

template<int C>
class MyClass {
public:

static constexpr int arraySize();
std::array<int, MyClass<C>::arraySize()> arr;
};

template<int C>
constexpr int MyClass<C>::arraySize(){ return MyClass<C-1>::arraySize() + C; }

template<>
constexpr int MyClass<0>::arraySize() { return 0; }

导致以下错误:

fatal error: recursive template instantiation exceeded maximum depth of 1024 std::array::arraySize()> arr;

template<int C>
class MyClass {
public:

template<int N>
static constexpr int arraySize();
std::array<int, MyClass::arraySize<C>()> arr;
};

template<int C>
template<int N>
constexpr int MyClass<C>::arraySize(){ return MyClass::arraySize<N-1>() + N-1; }

template<int C>
template<>
constexpr int MyClass<C>::arraySize<0>() { return 0; }

出现以下错误:

tmp.cc:19:27: error: cannot specialize (with 'template<>') a member of an unspecialized template constexpr int MyClass::arraySize<0>() { return 0; }

是否有可能实现预期的行为?欢迎使用 C++14/C++17 功能的解决方案(我想应该可以使用 if-constexpr),但不会解决我的特定问题,因为只有 C++11 可用。

最佳答案

您可以将函数移动到类中,并针对基本情况专门化整个类。看起来像:

template<int C>
class MyClass {
public:

static constexpr int arraySize(){ return MyClass<C-1>::arraySize() + C; }
std::array<int, MyClass<C>::arraySize()> arr;
};

template<>
class MyClass<0> {
public:
static constexpr int arraySize(){ return 0; }
};

int main() {
MyClass<3> cls;
std::cout << cls.arr.size() << std::endl; // Output: 6
}

Live Example

关于c++ - 类模板中 std::array 的大小取决于模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48955977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com