【发布时间】:2020-08-26 16:35:00
【问题描述】:
我在通过网络发送数据时使用boost::variant 来实现类型擦除。当数据到达客户端或服务器时,我正在检查其结构以检索基础信息并在结构与 API 中约定的结构不匹配时报告错误。为此,我创建了一个轻量级引用包装器,它包含对变体的引用,并为结构检查和类型转换提供了方便的接口。
using value_t = boost::make_recursive_variant< /*types, some of them recursive*/ >::type;
class view_t {
public:
/*non-const methods to access value_*/
private:
value_t& value_;
};
class cview_t {
public:
/*const methods to access value_*/
private:
const value_t& value_;
};
view_t view(value_t& v){ return v; }
cview_t cview(const value_t& v){ return v; }
cview_t cview(value_t&& v) = delete;
cview_t cview(const value_t&& v) = delete;
不幸的是,这个接口被证明很麻烦,因为每个具有view 成员的聚合类型都需要遵循相同的 const/non-const 拆分。我想知道将这两个类合并到一个视图中并在创建这样的视图的方法中使用 const_cast 是否合法:
class view_t {
public:
/*const and non-const methods to access value_*/
private:
value_t& value_;
};
view_t view(value_t& v){ return v; }
const view_t cview(const value_t& v){ return const_cast<value_t&>(v); }
const view_t cview(value_t&& v) = delete;
const view_t cview(const value_t&& v) = delete;
【问题讨论】:
标签: c++ constants const-correctness reference-wrapper