Variadic CRTP模板类,其中一个字段使用constexpr,基于参数类列表

dam*_*gad 5 c++ variadic-templates c++11

我写了(在c ++ 11中)一个可变参数模板constexpr函数,它计算参数类型的最大大小,例如:

maxSizeof<int, char, MyType>()
Run Code Online (Sandbox Code Playgroud)

这工作正常.然后我想有一个可变参数模板类,其中一个字段是一个大小等于maxSizeof()的数组.这也应该正常工作:

template <typename... TypesT>
    class Myclass {
        uint8_t field[maxSizeOf<TypesT...>()]
    }
Run Code Online (Sandbox Code Playgroud)

但我还需要Myclass为每个参数类型声明方法.我通过以下方式使用CRTP:

template <typename... TypesT>
class Myclass;

template <>
class Myclass {
    uint8_t field[maxSizeOf<TypesT...>()] // (1) Couldn't do it here as there are no `TypesT`
}

template <typename FirstT, typename... OtherT>
class Myclass<FirstT, OtherT...> : public Myclass<OtherT...> {
    public:
        virtual void doSomething(FirstT object) = 0;
    private:
        uint8_t field[maxSizeOf<FirstT, OtherT...>()] // (2) Shouldn't do it here as it will create field for all of the "middle" classes
}
Run Code Online (Sandbox Code Playgroud)

问题是如何实现方法的声明,同时具有适当大小的数组字段.(1)和(2)因评论中说明的原因不起作用.

Rei*_*ica 6

像大多数SW工程问题一样,这可以通过添加更多层间接来解决[1]:

template <typename... TypesT>
class MyclassFunctions;

template <>
class MyclassFunctions
{};

template <typename FirstT, typename... OtherT>
class MyclassFunctions<FirstT, OtherT> : public MyClassFunctions<OtherT...>
{
public:
  virtual void doSomething(FirstT object) = 0;
};

template <typename... TypesT>
class Myclass : public MyclassFunctions<TypesT...>
{
  uint8_t field[maxSizeOf<TypesT...>()]
};
Run Code Online (Sandbox Code Playgroud)

  • "计算机科学中的任何问题都可以通过另一层次的间接解决." https://en.wikipedia.org/wiki/Fundamental_theorem_of_software_engineering (6认同)