c++ - boost::作为友元类的变体

标签 c++ boost c++98 boost-variant

对于我想在 boost::variant 中使用的类型 Foo,我想将默认构造函数设置为 private ,因为它只应该被允许由 boost::variant 调用。

遗憾的是我还无法弄清楚 boost::variant 的声明魔法并简单地声明

struct Foo {
private:
  Foo();
  template <class T1, class T2>
  friend class boost::variant<T1, T2>;
};

也没有编译。有什么办法可以做到这一点还是我需要保留 Foo() public

最佳答案

[此答案仅针对 C++98/03;对于现代代码,请参见下文]

boost::variant 的模板参数数量由 BOOST_VARIANT_LIMIT_TYPES 给出。您可以通过利用 Boost.Preprocessor 来使用它:

#include "boost/preprocessor/repetition/enum_params.hpp"

struct Foo {
private:
  Foo();

  template <BOOST_PP_ENUM_PARAMS(BOOST_VARIANT_LIMIT_TYPES, class T)>
  friend class boost::variant;
};

boost::variant 被声明为带有 BOOST_VARIANT_LIMIT_TYPES 模板参数的类模板,因此您必须这样引用它。这是 BOOST_PP_ENUM_PARAMS(a, b) 的工作,它扩展为 a 逗号分隔项的列表,每个项都是 b附加一个唯一的编号。例如,

BOOST_PP_ENUM_PARAMS(5, class T)

将扩展为:

class T0, class T1, class T2, class T3, class T4

请注意,上述内容适用于问题范围,即仅限于 C++98/03。从 C++11 开始,就存在可变参数模板,当这些模板可用于 Boost 时,BOOST_VARIANT_LIMIT_TYPES 未定义,并且上述代码不起作用。 Boost 提供了一种可以在有或没有变量的情况下工作的替代方案;请参阅this answer了解详情。

关于c++ - boost::作为友元类的变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29409677/

相关文章:

c++ - 使用 Makefile 在编译中排除源文件

c++ - 如何从 shared_ptr 调用私有(private)析构函数?

c++ - 如何访问 vector 迭代器中的类变量?

c++ - boost::scoped_ptr 和 C++ 中的 STL

c++ - boost 随机生成器返回相同的值

c++ - C++ 98 中的部分模板特化?

c++ - 如何在 Armadillo 中的矩阵中执行逐元素 bool 运算

C++:在基类的成员函数中复制对象数据

c++ - 无法使用 boost asio 专门绑定(bind)到网络端口

c++ - C++中的有序树