【问题标题】:Known array / pointer size as argument已知数组/指针大小作为参数
【发布时间】:2020-01-17 16:21:09
【问题描述】:
InputManager* input = new InputManager(new int[]{ SDLK_UP, SDLK_DOWN, SDLK_LEFT, SDLK_RIGHT });

我想传递这个键数组(或指向它的指针),但我需要 InputManager 的构造函数来知道它的大小。既然它在编译时就知道了,我怎么得到它?

我在网上找到了这个模板

template <int N>
InputManager::InputManager(int (&keyArray)[N]) {
    this->maxKeys = N;
    this->keys = keyArray;
}

但我得到一个参数不匹配的错误。

我需要任何可能的解决方案,我不需要手动编写长度。所以宏、模板或其他任何东西都可以接受。

【问题讨论】:

    标签: c++ c++11 templates macros


    【解决方案1】:

    不要使用太多指针。它不健康,您可能会泄漏内存,或者尝试释放您无法释放的内存(如果您没有传递新分配的数组)。这是对您的代码的最小修改:

    class InputManager {
    public:
        template <int N>
        InputManager(int (&keyArray)[N]) 
            : maxKeys(N), keys(std::make_unique<int[]>(N))
        {
            std::copy_n(keyArray, N, keys.get());
        }
    
    private:
        std::size_t maxKeys;
        std::unique_ptr<int[]> keys;
    };
    
    int main() {
        int keys[] = { 1, 5, 4, 7, 2 };
        InputManager input {keys};
    }
    

    这个compiles(GodBolt)。

    注意事项:

    • 这样,您无需编写自定义析构函数;尽管您需要编写一个复制数据的赋值运算符;和一个拷贝构造函数。
    • 最好只在内部使用std::vector(或std::array,如果您事先知道输入大小),并在构造函数中使用任意范围或范围的键。

    【讨论】:

      【解决方案2】:

      使用可变参数模板将该数组的创建包装到函数中。

      如果你只想返回一个指向数组的指针:

      template<class ... enums>
      int* makeArray (enums ... e) {
          return new int[sizeof...(e)]{e...};
      }
      

      当你想知道返回数组的大小时,你可以返回pair

      template<class ... enums>
      std::pair< int*, size_t > makeArray2(enums ... e) {
          constexpr size_t N = sizeof...(e);
          return std::make_pair( new int[N]{e...}, N);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-05
        • 2010-12-15
        • 2012-01-24
        • 1970-01-01
        • 2014-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多