能否将std::visit设为私有operator()的Visitor类的友元?
让std::visit访问私有operator()的兼容式友元声明方案
可以将std::visit声明为Visitor类的友元,关键是要写出兼容GCC和Clang的模板签名。由于std::visit是标准库提供的模板函数,两个编译器对其底层重载的实现细节略有差异,因此需要用通用的模板声明来覆盖核心签名。
修改后的代码示例如下:
class Visitor { // ... 其他类成员 ... private: void operator()(TypeA&); void operator()(TypeB&); // ... 其他私有成员 ... // 兼容GCC与Clang的std::visit友元声明 template <typename V, typename... Variants> friend decltype(auto) std::visit(V&& vis, Variants&&... vars); };
说明
这个模板声明匹配了C++标准中std::visit的核心接口:接受一个可调用对象(这里就是Visitor实例)和一个或多个std::variant对象,返回值类型由调用结果推导。该写法能同时适配GCC和Clang对std::visit的实现,确保编译器认可std::visit作为友元,从而允许它调用Visitor类的私有operator()重载。
内容的提问来源于stack exchange,提问作者thebugger
相关产品推荐
相关产品推荐

