微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用可变参数模板和移动语义

如何解决使用可变参数模板和移动语义

我正在尝试围绕可变参数模板, 移动语义,(也许完美转发?), 并学习如何将变量传递给不同的函数

比方说,有一个类 Foo ,它包含一个 Elem(模板化)类实例的数组。 这些数组元素会定期重新初始化(因此是 Elem.init 函数)。

下面我试图用三个大字符串(或任何其他实现移动语义的大对象)初始化一个 Elem 到它们将被存储的地方: 在 Foo 的数组中,在某个位置。

是否可以立即将它们移动到 Foo 的向量位置? 或者它始终是“复制语义”而不是移动。

总的来说,我试图避免复制大堆栈分配的字符串,并以某种方式让它们位于目标向量的位置。 不确定什么是最好的方法

(目前我得到的只是分段错误

感谢阅读! 以下在线代码https://onlinegdb.com/HJc7U_jIO

// Imports: Dependencies
import React,{ useEffect } from 'react';
import { Redirect,RouteProps } from 'react-router-dom';
// import { useSelector } from 'react-redux';

// Imports: TypeScript Types
import { ReduxState,UserRole } from '../../types/types';

// Component: Auth (User Role)
const AuthUserRole = (WrappedComponent: React.FC<RouteProps>,allowedRoles: Array<UserRole>) => {
  // With Auth User Role
  return class WithAuthUserRole extends React.Component {
    // FIX LATER: HARDCODED FOR Now
    state = {
      user: {
        role: 'Admin',// role: 'Manager',// role: 'Employee',},};

    render() {
      // User Role
      const { role } = this.state.user;

      // Allowed Route
      if (allowedRoles.includes(role as UserRole)) {
        return <WrappedComponent {...this.props} />;
      }
      // Forbidden Route
      else {
        return (
          <Redirect
            to={{
              pathname: '/',state: {
                // from: props.location,error: 'Forbidden: Not Authorized',}
            }}
          />
        );
      }
    }
  };
};

// Exports
export default AuthUserRole;

解决方法

为了正确“调试”这些问题,您可能需要编写一个包含复制和移动构造函数、析构函数和复制和移动赋值运算符的类,这些运算符声明它们正在被执行。然后,您可以判断这些值在传递和/或创建时会发生什么。

无论如何,您正在使用三个 add() 参数调用 std::string&& 方法。但是 - 在函数内部,一旦它们绑定到 args...,它们现在是 lvalues!您需要在 std::move() 方法中使用 add()

template <typename... Args>
void add(Args... args)
{
    mElements[mNextFreeIndex].init(std::move(args)...);
    mNextFreeIndex++;
}

或申请转发:

template <typename... Args>
void add(Args&&... args)
{
    mElements[mNextFreeIndex].init(std::forward<Args>(args)...);
    mNextFreeIndex++;
}

在一个几乎不相关的注释中,我建议阅读以下内容:"Parameter" vs "Argument" 关于这两个术语的使用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。