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

时间:2018-02-23 20:45:33

标签: c++ c++11 templates

我有以下课程模板

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; }

导致以下错误:

  

致命错误:递归模板实例化超出最大值         深度1024       的std ::阵列:: ARRAYSIZE()&GT; 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:错误:无法专门化(使用&#39;模板&lt;&gt;&#39;)成员         非专业化模板   constexpr int MyClass :: arraySize&lt; 0&gt;(){return 0; }

是否有可能实现理想的行为?使用C ++ 14 / C ++ 17功能的解决方案(我想应该可能是usin if-constexpr)受到欢迎,但由于只有C ++ 11可用,因此无法解决我的特定问题。

2 个答案:

答案 0 :(得分:4)

您可以将该函数移动到类中,并为基本案例专门化整个类。看起来像是:

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

答案 1 :(得分:1)

您也可以使用成员变量而不是成员函数。

template <int C>
class MyClass {
   public:

      static constexpr int array_size = MyClass<C-1>::array_size + C;
      std::array<int, array_size> arr;
};

template <>
class MyClass<0> {
   public:
       static constexpr int array_size = 0;
};