获取具有与派生类表达式相同的cv-qualification和value类别的基类子对象

时间:2017-10-23 20:57:36

标签: c++

假设我有一个类型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类别,或者换句话说,我想完美地转发基类子对象。最简单的方法是什么?

1 个答案:

答案 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模板,因此您可以使用它。似乎没有什么可以转移价值类型。