假设我有一个类型document.getElementById('input').addEventListener('change', function() {
var file = this.files[0];
var reader = new FileReader();
reader.onload = function(e) {
let map = readMap(e.target.result);
drawMap(map);
}
reader.readAsText(file);
}, false);
function drawMap(map) {
let x = 0;
let y = 0;
for(var i=0; i<map.length;i++) {
for(var j=0; j<map[i].length;j++) {
if(map[i][j] === 1) {
ctx.fillRect(x,y,BLOCK_SIZE,BLOCK_SIZE);
x+=BLOCK_SIZE;
}else if(map[i][j] === 'S') {
player.x = x;
player.y = y;
x+=BLOCK_SIZE;
} else {
x+=BLOCK_SIZE;
}
}
x=0;
y+=BLOCK_SIZE;
}
}
派生自某些V
专业化。 std::variant
函数不适用于std::visit
参数,因此必须转换为基数。例如,而不是
V
有必要写
std::visit(visitor, std::move(v));
假设我想写一个std::visit(visitor, static_cast<V::variant&&>(v));
的重载来做正确的事情,以避免每次我想访问visit
对象时都输入static_cast
:< / p>
V
对于参数template <class Visitor, class T,
class = std::enable_if_t<std::is_same_v<std::decay_t<Val>, Value>>>
auto visit(Visitor&& vis, T&& v) {
return std::visit(std::forward<Visitor>(vis), ?)
}
,我想提取?
variant
基类子对象,但结果表达式需要具有相同的cv-qualification和value类别,或者换句话说,我想完美地转发基类子对象。最简单的方法是什么?
答案 0 :(得分:2)
我想不出任何内置的方法来做到这一点。但是,编写一组模板以将这些限定符从一种类型转换为另一种类型非常简单。例如,transfer_cv
可以像这样实现:
template<class T1, class T2>
struct transfer_const {using type = typename std::remove_const<T2>::type;};
template<class T1, class T2>
struct transfer_const<const T1, T2> {using type = const T2;};
template<class T1, class T2>
struct transfer_volatile {using type = typename std::remove_volatile<T2>::type;};
template<class T1, class T2>
struct transfer_volatile<volatile T1, T2> {using type = volatile T2;};
template<class T1, class T2>
struct transfer_cv {using type = typename transfer_volatile<T1, typename transfer_const<T1, T2>::type>::type;};
传输值类型的模板可以以相同的方式实现。然后,您可以简单地将派生类的限定符传递给基类。鉴于这些模板可以在许多不同的情况下派上用场,这可能是值得的。
修改:提升类型特征实际上有一个copy_cv
模板,因此您可以使用它。似乎没有什么可以转移价值类型。