如何解决使用可变参数模板和移动语义
我正在尝试围绕可变参数模板, 移动语义,(也许完美转发?), 并学习如何将变量传递给不同的函数。
比方说,有一个类 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 举报,一经查实,本站将立刻删除。